C语言回溯法[精].docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C语言回溯法[精]

回 溯 算 法 学习重点: 理解回溯法的基本思想; 掌握回溯法解题的基本算法。 ` 学习过程: 一、回溯法的基本思想 回溯法又称试探法。回溯法的基本做法是深度优先搜索,是一种组织得井井有条的、能避免不必要重复搜索的穷举式搜索算法。 回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。(依次用各种方法一一去试探)的过程中,当在P点有N种选择,则从第一种开始尝试,若第K种可行,即这一步搜索成功,打上标记,再向前(即 P+1点)搜索;如在P点搜索失败(所有的方法都试探过,没有一种可行),为了摆脱当前的失败,就返回搜索进程中的上一点(即P-1点),再用第K+1种方法(假设上次在P-1点用第K种方法搜索成功,必须明确以前用过的方法不能再用,否则会陷入死循环)再去搜索,重新寻求解答。这样搜索回溯,再搜索再回溯,如能搜索到终点,问题有解,如最后回溯到出发点,问题就无解。 这种在搜索的过程中,先对深度大的点进行扩展的算法,叫深度优先搜索法。 设搜索深度指针为P,搜索方法指针为I,可把深度优先搜索算法写成如下形式: P=0:I=0 DO I=I+1(搜索到一种方法) IF 搜索方法有效 THEN 试探产生临时新结点 IF 符合条件 THEN P=P+1(深入一步),新结点记录,I=0,再全方位搜索 IF到达终点 THEN 结束搜索,输出结果 END IF ELSE(搜索的方法无效) I=上次搜索的方法(下一轮将用I的下一方法去搜索),P=P-1(后退一步返回上结点) END IF L00P UNTIL P=0 IF P=0 THEN ’深度指针P为0,表示已退到起始状态,是本题无解的标志 无解 ELSE 输出结果 END IF END 二、应用举例 1、【问题描述】有一迷宫(如图),可用一个10行9列的0~1矩阵表示,其中0表示无障碍(白色),1表示有障碍(黑色)。设入口位置的坐标为(2,1),出口为(9,9),规定每次移动中只能从一个无障碍的单元移到其周围四个方向上任一无障碍的单元。试编程给出通过迷宫的一条路径或报告一个“无法通过”的信息。 【问题分析】 要寻找一条通过迷宫的路径,通常用深度优先搜索。当在迷宫入口,先确定某个前进走向,依此一一试探,如某一走向有路可走,就前进一步,继续向前试探;如果无路可走,则退回一步,重新选择未走过的方向再去试探可前进的路。进进退退,再进进再退退,按此规则不断搜索,直至搜索到出口,闯迷宫成功。如最后退回入口,则此迷宫是个死胡同。 在搜索迷宫时,为了不迷失方向和不走重复的路,在搜索时必须在前进与回退的路上设置一些标记,这样,就可以判断哪条路是已经走过的,哪条路是死胡同,哪条路还没有走过。根据这些标记,就能正确的找到通向出口的路,在回溯时也能正确地找到应返回的位置,避免重新进入死胡同。 【数据结构分析】 ⑴建立一个相应的迷宫数组A(10,9),再根据迷宫的0~1矩阵(不同的迷宫有不同的矩阵数据),给数组的每一个元素赋予相应的值,如用X、Y表示迷宫中的位置坐标,则: A(X,Y)=0表示此处可走(白色) A(X,Y)=l表示此处是路不通(黑色) A(X,Y)=2表示此处已走过 如果可走的位置已走过,就使原来的A(X,Y)=0改为A(X,Y)=2,这一点很重要,保证不陷入死循环(避免重复走某一步)。前面的两个图中后图就是前图的数学模型。 ⑵设I为搜索走向指针,I的取值范围1~4(1向右、2向下、3向左、4向上),这四个走向用一个数组V(4,2)来表示。第一个下标是I表示某个走向;第二个下标,1表示行增量(向下为正,向上为负),2表示列增量(向右为正,向左为负)。四个走向的下标及其增量如下图所示。 ⑶变量P为深度指针,前进一步P=P+1,后退一步P=P-1,走了多少步,P值就多大。 ⑷建立X和Y数组,存放已行走路线中各步的X和Y值,因不知走多少步才能走出迷宫,所以这两个数组可以定义大一些;如:DIM X(100),Y(100),表示走的第P步,则X(P)=X,Y(P)=Y。当某步无法前进,要退回前一步,前一步的位置X、Y值就可以从这两个数组中取出。最后输出两个数组的值,就是走出迷宫的路线。 ⑸建立S数组,用它来存放已走路线中各步搜索走向的I值。当在P步搜索前进用I走向,则S(P)=I。当某步无

文档评论(0)

dart002 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档