PASCAL递归和回溯算法.pptVIP

  1. 1、本文档共49页,可阅读全部内容。
  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文档。上传文档
查看更多
PASCAL递归和回溯算法

递归与回溯算法 山东省实验中学 王乃广 判断(x,y)位置能否放数值k的函数 function ok(x,y,k:integer):boolean; begin ok:=true; if x1 then if not (p[b[x-1,y]+k]) then          ok:=false; if y1 then if not (p[b[x,y-1]+k]) then ok:=false; end; procedure try(x,y,dep:integer);//递归搜索(x,y)处放第 dep 个数 var i:integer; begin if dep=n*n+1 then print else //如果已放了n*n个数,得出一种方法 for i:=1 to n*n do if not(used[i]) and ok(x,y,i) then begin b[x,y]:=i; used[i]:=true; if y=n then try(x+1,1,dep+1) //如果当前是最右边一列,则转到下一行首列 else try(x,y+1,dep+1); //继续放当前行的下一列 used[i]:=false; //释放标志 end; end; procedure print; var i,j:integer; begin for i:=1 to n do begin for j:=1 to n do write(b[i,j]:4); writeln; end; halt; end; 主程序: begin readln(n); if n=1 then begin writeln(NO);halt;end; prime; b[1,1]:=1; for i:=2 to n*n do used[i]:=false; used[1]:=true; try(1,2,2); writeln(NO); end. 例 单词接龙(NOIP2000) 单词接龙是一个与我们经常玩的成语接龙相类似的游戏,现在我们己知一组单词,且给定一个开头的字母,要求出以这个字母开头的最长的龙(每个单词都最多在龙 中出现两次),在两个单词相连时,其重合部分合为一部分,例如beast和astonish,如果接成一条龙则变为beastonish,另外相邻的两部分不能存在包含关系,例如at和atide间不能相连。 【输入】 输入的第一行为一个单独的整数n(n=20)表示单词数,以下n行每行有一个单词,输入的最后一行为一个单个字符,表来“龙”开头的字母,你可以假定以此字母开头的龙一定存在。 【输出】 只需输出以此字母开头的最长的“龙”的长度。 【样例输入】 5 at touch cheat choose tact a 【样例输出】 23 //连成的“龙”为atoucheatactactouchoose 【分析】 深度优先搜索。第一步选择以某一个单词为龙头,确定以后将记录单词使用次数的数组清零,作为龙头的单词使用次数加一,然后每次判断是否可以再连接单词,如果可以,向下继续递归搜索,否则判断是否需要更新最优解。 【参考程序】 program shdj; var a:array[1..21] of integer; i,m,n,ans,k:longint; b:array[1..21] of string; s,dra:string; c:char; * * 递归的定义: 在定义一个过程或函数时出现调用本过程或本函数的成分,称为递归。若调用自身,称为直接递归。若过程或函数p调用过程或函数q,而q又调用p,则称为间接递归。 在程序设计中,使用递归技术往往使函数的定义和算法的描述简洁且易于理解。 例: function jiech(n:integer):longint; begin if n=0 then jiech:=1 else jiech:=n*jiech(n-1); end; function fib(n:integer):longint; begin if(n=0)or(n=1)then fib:=1 else fib:=fib(n-1)+fib(n-2); end; 爬楼梯时可以1次走1个台阶,也可以1次走2个台阶。对于由n个台

文档评论(0)

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

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

1亿VIP精品文档

相关文档