回溯与分支限界算法设计.docxVIP

  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文档。上传文档
查看更多
算法设计与分析实验报 告 专业 班级 姓名 学号 实验名称 实验四:回溯与分支限界算法设计 实验目的 掌握回溯法解决问题的一般步骤。 学会使用回溯法解决实际问题。 掌握分支限界法解决问题的基本思想。 学会使用分支限界法解决实际问题。 骑士游历问题(采用回溯法): 在国际象棋的棋盘(8行X 8列)上放置一个马,按照“马走 日字”的规则,马要遍历棋盘,即到达棋盘上的每一格,并 且每格只到达一次。若给定起始位置(x0,y0),编程探索出一 条路径,沿着这条路径马能遍历棋盘上的所有单元格。 2.行列变换问题(采用分支限界法): 实验内容给定两个m n方格阵列组成的图形 A和图形B,每个方格的 颜色为黑色或白色,如下图所示。行列变换问题的每一步变 换可以交换任意2行或2列方格的颜色,或者将某行或某列颠 倒。上述每次变换算作一步。试设计一个算法,计算最少需 要多少步,才能将图形A变换为图形B。 实验内容 图形A图形B 图形A 1.骑士游历问题的解题思路或算法思想: 如果在每步选择方向时,不是任意选择一个方向,而是经过 一定的测试和计算,“预见”每条路的“宽窄”,再选择一 条最“窄”的路先走,成功的可能性较大。理由是先走“困 难的路”,光明大道留在后面。因为每一格迟早都要走到, 与其把困难留在后面,不如先走“困难的路”,这样路就会 越走越宽,成功的机会就越大。这种方法称为预见算法。 算法描述 为母个力|口」测定一个值 可通路数,仑表小该位直上还有 多少条通路。在每一格上对8个方向都进行试探,并分析比 较,下一步应该选择可通路数值最小的方向走。 2.行列变换问题的解题思路或算法思想: 先进先出队列式分支限界法 输入数据,将计算出的最少变换次数和相应的变换序列输出。」 第1行是最少变换次数。从第2行开始,每行用4个数表小 一次变换。 程序及运行结果 1.骑士游历问题的程序: package ; import public class Qishi ( private boolean Travel(int firstX, int firstY, int皿 board) ( ength; j++) { if (board[i]田 10) { + board[i][j]); } else { } ); } } } 实例: 输入起始点(。-7); 游历完成; 41 14 43 46 25 16 27 2 44 5S 49 3S 1 24 17 13 42 45 58 47 26 3 28 弱 63 54 39 关 37 10 23 53 12 57 43 59 21 29 4 G4 g 62 51 36 49 32 19 11 52 7 66 21 34 5 30 8 61 19 3S 6 31 20 33 2.行列变换问题的程序: package ; import graph( static int sour, dest;//sour是图形的初始整数,dest是图形的目的整 数 static int ans[]=new int[116];//静态变量(即全局变量),用于存 放图形变换的路径 int m=4,n=4,x; int row[]=new int[4]; int col[]=new int[4]; void setx(int x)( =x; } int getx()( return ; } void rowx()(//将一个整数划分成四行二进制 int y; for(int i=0;im;i++)( y=1; row[i]=0; for(int j=0;jn;j++){ if((x1)!=0) //如果x的最低位是1 row[i]|=y; y=1; x=1; } } } void colx(){//将一个整数划分成四列二进制 int y; for(int j=0;jn;j++) col[j]=0; y=1; for(int i=0;im;i++){ for(int j=0;jn;j++){ if((x1)!=0) //如果x的最低位是1 col[j]|=y; x=1; } y=1; } } void rowy()(//将四行二进制转换成一个整数 int z=1, x=0, y; for(int i=0;im;i++){ y=row[i]; for(int j=0;jn;j++){ if((y1)!=0) //如果y的最低位是1 x|=z; z=1; y=1; } } =x; } void coly(){//将四列二进制转换成一个整数 int z=1, x=0,-y; for(int i=0;im;i++)( for(int j=0;jn;j++)( if((col[j]1)!=0)//如果y的最低位是1 x|=z; z=1; col[j]=

文档评论(0)

189****2507 + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档