回溯法实验(n皇后问题)(迭代法).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文档。上传文档
查看更多
算法分析与设计实验报告 第 三 次附加实验 姓名 学号 班级 时间 12.26 上午 地点 工训楼 309 实验名称 回溯法实验(n 皇后问题)(迭代法) 实验目的 1. 掌握回溯法求解问题的思想 2. 学会利用其原理求解相关问题 实验原理 用 n 元组 x[1:n]表示 n 后问题的解。其中,x[i]表示皇后 i 放在棋盘的第 i 行的第 x[i]列。由于不允许将 2 个皇后放在同一列上,所以解向量中的 x[i] 互不相同。2 个皇后不能放在同一斜线上是问题的隐形约束。 用回溯法解 n 后问题时,用完全 n 叉树表示解空间。可行性约束 Place 剪出 不满足行、列和斜线约束的子树。 递归函数 Backtrack(1)实现对整个解空间的回溯搜索。 Backtrack(i)搜索 解空间中第 i 层子树。类 Queen 的数据成员记录解空间中结点信息,以减少 传给 Backtrack 的参数。Sum 记录当前已找到的可行方案数。 实验步骤 数组法: (1)根据 n 皇后问题,可以把其设想为一个数组; (2)根据 n 皇后的规则,可以设想为数组上同一直线,横线,斜线的数字都 不能相同,由此可以得到判断条件; (3)根据判断条件之后,建立回溯点,即可解决问题。 堆栈法: (1) 检索当前行是否可以放置一个皇后; (2) 利用检索过程,通过递归的方式,来确定每一个皇后的位置。 递归回溯: void Queen::Backtrack(int t) { if(tn) { sum++; /*for(int i=1;i=n;i++) //输出皇后排列的解 { coutx[i] ; } coutendl;*/ } else {//回溯探索第i行的每一列是否有元素满足要求 for(int i=1;i=n;i++) { x[t]=i; if(Place(t)) { Backtrack(t+1); } } } } 迭代回溯: void Queen::Backtrack() //迭代法实现回溯函数 { x[1] = 0; int k = 1; while(k0) { x[k] += 1; //先将皇后放在第一列的位置上 while((x[k]=n)!(Place(k))) //寻找能够放置皇后的 位置 { x[k] += 1; } if(x[k]=n) //找到位置 { if(k == n) //如果寻找结束输出结果 { /*for (int i=1;i=n;i++) { coutx[i] ; } coutendl; */ sum++; } else //没有结束则找下一行 { k++; x[k]=0; } } else //没有找到合适的位置则回溯 { k--; } } } 测试 测试结果 较小皇后个数结果: 递归法较大的皇后个数:  迭代法较大的皇后个数: 输入较大的皇后个数 15: 输入皇后个数是 16 时: 当输入的皇后个数是 20 时: 运行了一个上午都没有出结果,所以果断放弃了。 实验分析 在上述的实验结果中: (1) 我们可以观察到输出皇后排序结果与不输出结果,只输出解的个数是有 差距的。 (2) 而且通过对比递归与迭代两种不同的实现方法,发现情况是基本相同的, 时间上并没有什么太大的差距,但是相对的迭代会稍微快一点点。 (3) 然后对比输入较大的皇后个数之后,仅仅一个皇后之差就会使得时间上 相差很大,如 15 个皇后的时候所用的时间是 280.102,而当皇后个数是 16 时,所用的时间是 2153.463,从而我们可以看出 n 皇后问题的时间复杂度是 指数级的,从而 n 皇后问题确实是 NP 问题。 实验心得 Dijkstra 算法在之前的数据结构中就学过,在当时只是学过这种思想,并没 有去深思这种思想其背后到底是一种怎样的思想在里面。后来经过本门课的 学习,对于贪心算法有了更深刻的了解,也知道了如何利用贪心算法去解决 问题。最开心的是经过一定时间的练习,我的编程能力有了一定的提高,之 前看见就很头疼的问题,现在也能静下心来去思考,而且实现 Dijkstra 算法 也可以通过一定程度的思考也能写出来了,感觉还是很开心的。Dijkstra 算 法求单源最短路径在很多地方都有应用,经过一次又一次的练习,终于能好 好的掌握这一算法了,还是希望不要那么快忘记啊。 实验得分 助教签名 附录: 完整代码(回溯法) //回溯算法 递归回溯 n皇后问题 #includeiostream #includetime.h #includeiomanip #includemath.h using namespace std; class Queen { friend int nQueen(int); private:  //定义友元函数,可以访问私有

文档评论(0)

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

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

1亿VIP精品文档

相关文档