八数码难题2.docVIP

  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文档。上传文档
查看更多
八数码难题2

 HYPERLINK :8000/vijos/Problem_Show.asp?id=1472 八数码难题2-由此想到的双向广搜的解法 【问题描述】: 在 3 * 3 的棋盘上,摆 有八个棋子,每个棋子上标有 1 至 8 的某一数字。棋盘中留有一个空格。空格周围的棋子可以移到空格中。要求解的 问题是,给出一种初始布局 [ 初始状态 ] 和目标布局 [ 目标状态 ] ,输出从初始布局到目标布局的转变至少需要的步数。 【输入格式】 输入由两行组成,每行8个数,分别表示初始状态和目标状态: 【输出格式】 输出步数,若无解输出“No solution!”。 【输入输出样例】 输入文件名: 8num.in 283164705 123804765 输出文件名:8num.out 5 时限:前两组数据不超过1秒,第三组数据不超过10秒 【 HYPERLINK :8000/vijos/Record_Show.asp?id=50001 评测状态】 编译通过... 测试数据1:答案正确... 0ms 测试数据2:答案正确... 0ms 测试数据3:答案正确... 3025ms ------------------------- Accepted 有效得分:100 有效耗时:3025ms 【参考程序】 {按照题目的做法,将9个数字用一个线性数组记录} program eightnum; const dir:array[0..3] of integer=(-3,1,3,-1); maxn=10000; type strr=string[9]; stat=record d:strr; f:integer; end; var d1,d2:array[1..maxn] of stat; a,l,i,j,r,k,head,tail,tail1,tail2,step,p1,p2:integer; s1,s2,start,obj:strr; chongfu1,chongfu2:boolean; procedure print(k,flag:integer); var i,step:integer; begin step:=0; if flag=1 then begin i:=head; while i0 do begin inc(step); i:=d1[i].f; end; i:=d2[k].f; while i0 do begin inc(step); i:=d2[i].f; end; end; if flag=2 then begin i:=d1[k].f; while i0 do begin inc(step); i:=d1[i].f; end; i:=head; while i0 do begin inc(step); i:=d2[i].f; end; end; writeln(step); halt; end; BEGIN readln(start); readln(obj); {读入起始位置} d1[1].d:=start; d1[1].f:=0;{先行数据库} d2[1].d:=obj; d2[1].f:=0;{逆行数据库} head:=0;tail1:=1;tail2:=1;step:=1;{tail1为先行数据库的尾指针,tail2为逆行数据库的尾指针} randomize;{随机函数,随机化效率可能会高一些} repeat inc(head);{公用头指针后移} p1:=pos(0,d1[head].d); p2:=pos(0,d2[head].d);{寻找各自0的位置,便于搜索} r:=random(4); for i:=0 to 3 do begin k:=(i+r) mod 4;{随机化选择首次移动的位置,四种情况} {先行的数据库搜索} if (p1+dir[k]=1) and (p1+dir[k]=9) and not(((p1=4) or (p1=7)) and (k=3) or ((p1=3) or (p1=6)) and (k=1)) then begin{注意线性数组中的限制条件} s1:= d1[head].d; s1[p1]:=s1[p1+dir[k]]; s1[p1+dir[k]]:=0; chongfu1:=false; for j:=1 to tail1 do if s1=d1[j].d then chon

文档评论(0)

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

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

1亿VIP精品文档

相关文档