7回溯算法.pptVIP

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

搜索算法---回溯 一、回溯的概念 从问题的某种可能情况出发,搜索所有能到达的可能情况,然后以其中一种可能的情况为新的出发点,继续向下探索 当所有可能情况都探索过且都无法到达目标的时候,再回退到上一个出发点,继续探索另一个可能情况 这种不断回头寻找目标的方法称为“回溯法”。 回溯搜索 回溯是一种模拟人类思维过程的算法思想。它的基本方法是: 按照深度优先的顺序向下一层扩展结点;扩展到某一层时,若已无法继续扩展且仍未找到解,则退回到父结点,从父结点的下一个分支开始,按同样的策略继续扩展……,直到找到问题的解或证明无解。 二、回溯的一般描述 program 程序名; const maxdepth=xxx; type statetype=****; {状态类型定义} var stack:array[1..maxdepth] of statetype; {存当前路径} total:integer; {路径数} procedure make(k:integer); {递归搜索以stack[k]为初始接点的所有路径} var i:integer; {子节点个数} begin if stack[k-1]是目标状态 then begin total:=total+1; 输出当前路径stack[1]..stack[k-1]; exit; {回溯(如果只需要一条路径,则exit改为halt即可)}} end; for i:=算符最小值 to 算符最大值 do begin 算符i作用于生成stack[k-1]产生子状态stack[k]; if stack[k]满足约束条件 then make(k+1);{若不满足,则通过for循环换一个算符扩展;递归返回该处时,系统自动恢复调用前的栈指针和算符;在通过for 循环换一个算符扩展。注:若在扩展stack[k].state时使用过全局变量,则应插入若干条语句,恢复这些全局变量在递归前的值} end; end; 三、回溯的一般步骤 首先需要为问题定义一个解空间(solution space),这个空间必须至少包含问题的一个解; 然后我们需要组织解空间,以便它能被容易地搜索。典型的组织方法是图或树。 最后对这个空间即可按深度优先的方法从开始节点进行搜索。 例1、四皇后问题 四皇后问题的递归实现---回溯法 例2、数字排列问题 例4.四色问题(初赛试题) 数字排列问题的递归实现 骑士游历问题的递归实现 四色问题的递归实现 二种方式的区别: 回溯法的剪枝 测试2 、棋盘覆盖 测试3.排队购票 测试4.错排问题 const maxn=10; var a:array[1..maxn*2] of integer; n,num:integer; procedure try(k,n0,n1:integer); var i,j:integer; begin if( )then begin inc(num); write(No.,num, ); for i:=1 to 2*n do write(a[i]:2); writeln; ( ); end; if(n0=n1)and(n0n)then begin a[k]:=0; try( ); end;   if( )and(n0n)then   begin   for i:=0 to 1 do   begin  a[k]:=i;   if i=0 then try(k+1,n0+1,n1)   else try(k+1,n0,n1+1);   end;  end;    if (

文档评论(0)

专注于电脑软件的下载与安装,各种疑难问题的解决,office办公软件的咨询,文档格式转换,音视频下载等等,欢迎各位咨询!

1亿VIP精品文档

相关文档