程序的设计实习课程课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《程序的设计实习课程课件.ppt》由用户(晟晟文业)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 程序 设计 实习 课程 课件
- 资源描述:
-
1、程序设计实习课程 (C+Programming Practice)程序设计实习第八讲 搜索o主讲教师:田永鸿oyhtianpku.eduoai.pku.edu/cpp2019/tyh/tyh.htmoidm.pku.edu/jiaoxue-CPP/cpp08.htmo2019年3月19日1北京大学程序设计实习课程内容提要o搜索n广度优先搜索n深度优先搜索o影响搜索效率的因素oPOJ 1011 木棍问题o作业2北京大学程序设计实习课程搜索o搜索:高级枚举n有顺序有策略地枚举状态空间中的结点,寻找问题的解3北京大学程序设计实习课程搜索oPOJ1077八数码问题:经典搜索问题n有一个3*3的棋盘,其
2、中有0-8 9个数字,0表示空格,其他的数字可以和0交换位置。求由初始状态1 2 34 5 67 8 0到达目标状态步数最少的解?1 2 34 5 67 88 2 31 4 65 74北京大学程序设计实习课程搜索o状态空间82341657823415768234165 78241357682341576823416575北京大学程序设计实习课程广度优先搜索o广度优先搜索n优先扩展浅层结点,逐渐深入第一层第二层第三层8234165782341576823416578241357682341576823416576北京大学程序设计实习课程广度优先搜索o广度优先搜索n用队列保存待扩展的结点,从队首队
3、取出结点,扩展出的新结点放入队尾,直到找到目标结点(问题的解)82341657823415768241357682341576823416577北京大学程序设计实习课程广度优先搜索o广度优先搜索的代码框架BFS()初始化队列初始化队列while(队列不为空且未找到目标结点队列不为空且未找到目标结点)取队首结点扩展,并将扩展出的结点放入队尾取队首结点扩展,并将扩展出的结点放入队尾8北京大学程序设计实习课程深度优先搜索o深度优先搜索n优先深入遍历靠前的结点82341657823415768234165078241357682341576823416579北京大学程序设计实习课程深度优先搜索o深度优
4、先搜索n可以用栈实现,在栈中保存从起始结点到当前结点的路径上的所有结点n一般用递归实现10北京大学程序设计实习课程深度优先搜索o深度优先搜索的非递归框架DFS()初始化栈初始化栈while(栈不为空栈不为空 且且 未找到目标结点未找到目标结点)取栈顶结点扩展,扩展出的结点放回栈顶取栈顶结点扩展,扩展出的结点放回栈顶11北京大学程序设计实习课程深度优先搜索o深度优先搜索的递归框架DFS(type cur_node,int depth)for(cur_node的每个子结点的每个子结点child_node)DFS(child_node,depth+1)o问题:在深度优先搜索中,若状态空间的图结构不要
5、显式的存下来,该如何处理?12北京大学程序设计实习课程深度优先搜索o深度优先搜索的递归框架n在深度优先搜索中,状态空间的图结构并不一定需要显式的存下来。type node;void DFS(int depth)for(node的每一个可行变化的每一个可行变化)改变改变node;DFS(depth+1);恢复恢复node;此种做法需要一个全局数需要一个全局数组组array来存放每个走过来存放每个走过的的node,arraydepth就就是进入是进入DFS函数时需要扩函数时需要扩展的节点展的节点13北京大学程序设计实习课程判重o判重n新扩展出的结点如果和以前扩展出的结点相同,则则个新节点就不必再考
6、虑n如何判重?重复?823416578234157682341650782413576823415768234165714北京大学程序设计实习课程判重o需要考虑的问题n状态数目巨大,如何存储?n怎样才能较快的找到重复结点?时间空间15北京大学程序设计实习课程判重o合理编码,减小存储代价n不同的编码方式所需要的存储空间会有较大差别82341657方案一:每个结点对应于一个九进制数,则4个字节就能表示一个结点。(99=387,420,489)判重需要一个标志位序列,每个状态对应于标志位序列中的1位,标志位为0表示该状态尚未扩展,为1则说明已经扩展过了标志位序列可以用字符数组存放。数组的每个元素存放
7、8个状态的标志位。位序列最多需要99位,因此存放位序列的数组需要99/8 个字节如果某个状态对应于一个9进制数a,则其标志位就是标志位序列中的第a位(其所属的数组元素下标是a/8)16北京大学程序设计实习课程判重o合理编码,减小存储代价n不同的编码方式所需要的存储空间会有较大差别82341657方案一:每个节点对应于一个九进制数,则4个字节就能表示一个节点。此方案需要编写字符串形式的9进制数到其整型值的互相转换函数。17北京大学程序设计实习课程判重o合理编码,减小存储代价n不同的编码方式所需要的存储空间会有较大差别82341657方案二:为结点编号把每个结点都看一个排列,以此排列在全部排列中的
8、位置作为其编号排列总数:9!=362880只需要一个整数(4字节)即可存下一个结点判重用的标志数组只需要362880字节即可。此方案比方案1省空间此方案需要编写给定排列求序号和给定序号求排列的函数,这些函数的执行速度慢于字符串形式的9进制数到其整型值的互相转换函数。18北京大学程序设计实习课程判重o时间与空间的权衡n对于状态数较小的问题,可以用最直接的方式编码以空间换时间n对于状态数太大的问题,需要利用好的编码方法以时间换空间n具体问题具体分析19北京大学程序设计实习课程广搜与深搜的比较o广搜一般用于状态表示比较简单、求最优策略的问题n需要保存所有扩展出的状态,占用的空间大n每次扩展出结点时所
9、走过的路径均是最短路o深搜几乎可以用于任何问题n只需要保存从起始状态到当前状态路径上的结点o根据题目要求凭借自己的经验和对两个搜索的熟练程度做出选择20北京大学程序设计实习课程影响搜索效率的因素o影响搜索效率的因素n搜索对象(枚举什么)n搜索顺序(先枚举什么,后枚举什么)n剪枝(及早判断出不符合要求的情况)21北京大学程序设计实习课程搜索o一种解决问题的方法,与枚举的思想类似。例如:求从北大到北京站的最短行车距离,假设只能走北京市五环以及五环以内的道路。n有很多种走法p从北大东门出来,有三条路:城府路、沿白颐路向南、沿白颐路向北p沿白颐路向南走到北四环路口又有三种选择:继续往南、沿北四环向东、
10、沿北四环向西。p22北京大学程序设计实习课程搜索o从北大到北京站的最短行车距离n假设的条件表明,只有有限种可能的走法n解决方法:p 列出每一种可能的路径:确定了搜索的空间p 对每一种可能的路径,分别计算行车距离p 从中找到最短的行车距离23北京大学程序设计实习课程24北京大学程序设计实习课程搜索的思想:遍历o根据所知道的知识知识,依次猜测各个可能的答案。o对每个可能的答案进行评估,确定所需要的答案o进行新新的猜测时:从两个方面利用已经完成的猜测的结果n将正在进行的猜测与已经完成的猜测进行比较,及早结束“无用”的猜测。从北大出发,所走的车程已经超过已经发现的路径的长度n利用已经完成的猜测,快速生
11、成新的猜测。已经找到一条从北大到北京站的路径,改变该路径上某个叉路口的选择可以得到新的路径。新路径与原路径的开始一段是相同的,包括从北大到该叉路口25北京大学程序设计实习课程程序设计练习1:城堡问题(POJ1164)o问题描述:图1是一个城堡的地形图。请你编写一个程序,计算n城堡一共有多少房间n最大的房间有多大o城堡被分割成mn(m50,n50)个方块,每个方块可以有04面墙26北京大学程序设计实习课程POJ1164o输入:程序从标准输入设备读入数据。n第一行是两个整数,分别是南北向、东西向的方块数。n在接下来的输入行里,每个方块用一个数字(0p50)描述。用一个数字表示方块周围的墙,1表示西
12、墙,2表示北墙,4表示东墙,8表示南墙。n每个方块用代表其周围墙的数字之和表示。城堡的内墙被计算两次,方块(1,1)的南墙同时也是方块(2,1)的北墙。n输入的数据保证城堡至少有两个房间o输出:城堡的房间数、城堡中最大房间所包括的方块数。结果显示在标准输出设备上。27北京大学程序设计实习课程POJ1164o样例输入4 7 11 6 11 6 3 10 6 7 9 6 13 5 15 5 1 10 12 7 13 7 5 13 11 10 8 10 12 13 o样例输出5928北京大学程序设计实习课程解题思想o对任意的方块(i,j),在输入描述中用p表示np8p (i,j)没有南墙,(i+1,
展开阅读全文