- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
圆桌骑士问题: 穷举法 输入数据:文件camelot.in包括了以字符串表示的棋盘初始状态。该字符串包含了一串最多有64个不同的棋子位置:首先是国王的位置,而随后是武士们的位置。每个位置由一对字母-数字表示:字母表示棋盘水平坐标,而数字表示棋盘垂直坐标。 输入实例: D4A3A8H1H8 输出数据: 文件camelot.out必须包含单一的一行,以一个正整数表示选手要实现聚会所需最少的移动次数。 输出实例: 10 圆桌骑士问题: 穷举法 由于问题的规模较少(8X8),国王与骑士的总个数为64,且国王最多只会与一个骑士结合,没有必要在中途将国王托付给其他的骑士。因此,我们可以完全穷举出国王与骑士最终的所有汇聚点,穷举出与国王可能汇合的所有骑士及其所有可能的汇合点,其最大穷举次数为8X8X8X8X63,程序完全可以承受。 为了便于计算和处理,我们需要进行一个预处理,即将任意两点之间走马字步距离计算出来(可使用Floyd或宽搜完成)。 构造法简介 穷举法 根据处理对象状态的构造特点,以及不同状态之间的生成关系,利用简单操作,从当前状态转变为下一个新的状态,实现所有状态的枚举. 构造法简介 穷举法 program L4;{构造法求N个元素全排列} const maxn=9; var x:array[1..maxn] of byte; n,i,k,l,r,temp:integer; b:boolean; begin write(n=);readln(n); for i:=1 to n do x[i]:=i; for i:=1 to n do write(x[i]);writeln;{第一个排列} 构造法简介 穷举法 b:=true; while b do begin k:=n-1;{找最靠右的数字变大的位置} while (k0) and (x[k]x[k+1]) do dec(k); if k=0 then b:=false{终止} else begin i:=n; while x[k]x[i] do dec(i); temp:=x[k];x[k]:=x[i];x[i]:=temp; 构造法简介 穷举法 l:=k+1;r:=n; while lr do begin temp:=x[l];x[l]:=x[r];x[r]:=temp; inc(l);dec(r); end; for i:=1 to n do write(x[i]);writeln; end; end; readln end. 五、穷举算法的深入应用 穷举法 分析:我们先不考虑后一条件,只考虑第一个条件,即把1~8八个数字放入8个格子中。这是容易做到的,就是8个数字的全排列,共有8!=40320种放法。然后对这8!个可行解用后一个条件加以检验,输出符合条件的解。对于后一个条件中“相邻”的判断,可以建立一个邻接表来解决: 1 1 2 2 1 3 3 1 4 4 2 3 5 2 5 6 2 6 7 3 4 …… 13 6 7 14 7 8 五、穷举算法的深入应用 穷举法 表中表示哪两个格子是相邻的,link[i,1]和link[i,2]是相 邻的格子的编号。全排列的产生,可以用八重循环,也可 以用专门的算法,程序留给同学们自己去完成。利用穷举 策略编制的程序,其运算量一般是很大的,因此如何提高 算法效率是穷举算法一个很重要的问题。一般应尽量减少 可行解的个数,使得第二步的检验运算量尽可能地少。 如何来优化算法呢? 五、穷举算法的深入应用 穷举法 如果注意到b3和b6两个格子,与它们“相邻”的格子有6个,也就是说,放入这两个格子中的数,必须和6个数不连续,仅可以和一个数是连续的,这样的数只有2个,即1和8。这样,b1,b3,b6,b8;4个格子中数的放法仅有两种可能:2、8、1、7和7、1、8、2。而b2、b4、b5、b7四个格子中的数仅需在3~6四个数中选择。经过上述优化,可行解仅有:2×4!=48个,大大减少了计算量。并且检验是否符合要求,也只需检查(1,2),(1,4),(2,5),(4,7),(5,8),(7,8)这6对数之差就可以了。 五、穷举算法的深入应用 穷举法 program exampleb; const link:array[1..6,1..2] of integer= ((1,2),(1,4),(2,5),(4,7),(5,8),(7,8)); var b:array[1..8] of integ
原创力文档


文档评论(0)