- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
迷宫类深度优先搜索的教学
摘要:深度优先搜索一般用来解决不能建立数学模型或有数学模型但解该模型的准确方法也不一定能运用现成算法的问题,属于图算法的一种。迷宫类问题是深度优先搜索算法的重要一类,可以作为学习搜索算法的重要入门。回溯和深搜的基本思想是一致的,所以回溯也可以看成深搜的一种,主要区别是回溯法在求解过程中不保留完整的数结构,而深度优先搜索则记下完整的搜索树,搜索树记录解答路径和状态判重的作用。
关键词:深度优先搜索迷宫类回溯递归
一、深度优先搜索
需要用计算机求解的组合问题一般有两种类型:
1、能够用简明正确的组合公式揭示问题。
对于这一类问题,我们尽量用解析法求解,因为一个好的数学模型建立了客观事物间准确的运算关系,运用这个数学模型求解是再合适不过的了。组合数学对常见的计数问题都建立了数学模型。
2、不能对给定问题建立数学模型,或即便有数学模型但解该模型的准确方法也不一定能运用现成算法。在求解枚举类型问题时,常会遇到这类问题。
对于第二类问题,我们一般采用搜索的方法解决,即从初始状态出发,运用题目给出的条件、规则扩展所以可能情况,从中找出满足题意要求的解答。
在搜索过程中,当探索到某一步时,发现原先的选择达不到目标,就退回到上一步重新选择。它主要用来解决一些要经过许多(不太多)步骤才能完成的而且每个步骤都有若干种(不太多)可能的分支,为了完成这一过程,需要遵守某些规则,但这些规则又无法用数学公式来描述的一类问题。
深度优先搜索(以下简称深搜)属于图算法的一种,英文缩写为DFS即DepthFirstSearch.其过程是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。简单点来说就是:路走到头,不撞墙不回头。
例:图的遍历
图1图的遍历
遍历如图1所示的图,图中部分结点之间有路径链接。遍历规则为:深度优先,右手路径优先,不能重复遍历。请问遍历结果是什么?遍历结果:ABCDEFGHI
迷宫类问题是深搜算法的重要一类,迷宫类问题的学习能更好的理解递归调用的过程、理解深搜的基本原理、掌握深搜程序编写的过程。
二、教学规划
我把迷宫类深搜的教学分成两个阶段,第一阶段是深搜入门,第二阶段是深搜进阶。
在第一阶段,通过扫地机器人、迷宫出口和数池塘三个例子介绍迷宫类深搜的基础知识,通过第一阶段的学习,学生要掌握以下内容:
理解递归的过程,能够画出递归的过程;
理解深搜程序编写的过程和实现原理;
理解函数递归调用的过程;
掌握迷宫类深搜的几种不同写法。
在第二阶段,讨论三类问题:最少步数问题(例题走出迷宫的最少步数)、第一条路径问题(例题迷宫的第一条出路)、所有路径问题(例题卒的遍历、迷宫的所有路径)。
迷宫的所有路径在递归函数中比深搜算法多了一步在回退时取消标记状态,实际上已经是回溯了,回溯是搜索算法中的一种控制策略,亦是求解特殊类型计
数题或较复杂的枚举题中使用频率最高的一种算法。
回溯法的求解过程是一个先序遍历一棵“状态树”的过程,只是这棵树不是遍历前预先建立的。在遍历过程中剪去那些不满足条件的分支。它的基本思想和深搜差不多:为了求得问题的解,先选择一种可能情况向前探索,在探索过程中,一旦发现原来的选择是错误的,就回溯一步重新选择,继续向前搜索,如此反复进行,直至得到解或证明无解。[1]
回溯的程序框架和深搜差不多,有两种写法,如下:
//实现思路一
intsearch(intk){
for(i=l;i=算法总数;i++){if(满足条件){
保存结果;
if(到目的地){
输出解;
}else(
search(k+1);
}
恢复;保存结果之前的状态,回溯一步;
}
//实现思路二
intsearch(intk)(if(至U目的地){
输岀解;
}else{
for(i=l;i=算符种数;i++){if(满足条件){
保存结果;
search(k+1);
恢复:保存结果之前的状态;〃回溯一步
}
}
}
三、教学案例
1、入门案例
例1、扫地机器人
问题简要描述:把需要清扫的区域划分成若干个正方形的单元格,扫地机器人从(1,1)格出发,按照向右、向下、向左、向上的顺序行走,沿某个方向行
走直到走不通时,换到下一个方向行走。每走过一个单元格,该单元格被标记一个数字,从1开始,每标记一个单元格数字增加1,直到所有的单元格都被标记过数字,扫地机器人自动停止运行。如图2所示
图2示例
解题思路:本题要求为矩阵每个点赋值,可以定义函数,来为矩阵赋值,比如:定义函数fun(intx,inty,intk),含义是为x、y点赋值为k。
调用函数时,首先为1,1点赋值为1,也就是fun(1,1,1),既然函数能
原创力文档


文档评论(0)