- 1、本文档共6页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法分析与设计实验报告第 6次实验姓名学号班级时间12.12下午地点四合院 实验名称回溯法实验(八皇后问题)实验目的(1)掌握回溯法求解问题的思想(2)学会利用其原理求解相关问题。实验原理利用回溯法解决八皇后问题,检验结果,并计算算法的执行时间,分析算法的有效性。八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象 棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上测试数据可以通过手工寻找三组满足需要的值,测试数组(M,N),其中 M 代表皇后所在的行,N 代表皇后所在的列。例如,第一组测试数据:(1,4)、(2,7)、(3,3)、(4、8)、(5,2)、(6,5)、(7,1)、(8,6);第二组测试数据(1,5)、(2,2)、(3,4)、(4,7)、(5,3)、(6,8)、(7,6)、(8,1);第三组测试数据:(1,4)、(2,2)、(3,7)、(4,3)、(5,6)、(6,8)、(7,5)、(8,1)。最后与编程求得的结果进行比较。如果这三组数据在最后编程求得的结果中,说明程序的编写基本没有什么问题。实验步骤数组法:1 根据 8 皇后问题,可以把其设想为一个数组;2 根据 8 皇后的规则,可以设想为数组上同一直线,横线,斜线的数字都不能相同,由此可以得出判断条件;3 根据判断条件之后,建立回溯点,即可解决问题。堆栈法:1 检索当前行是否可以放置一个皇后;2 利用检索过程,通过递归的方式,来确定每个皇后的位置———回溯的思想。关键代码bool place(int k, int *X){ int i; i=1; while(ik) { if((X[i]==X[k])||(abs(X[i]-X[k])==abs(i-k))) return false; i++; } return true;}void Nqueens(int n,int *X){ int k; X[1]=0;k=1; while(k0){ X[k]=X[k]+1; while((X[k]=n)(!place(k, X))) X[k]=X[k]+1; if(X[k]=n) if(k==n) { for(int i=1;i=n;i++) coutX[i] ; cout\n; } else{ k=k+1; X[k]=0; } else k=k-1; }}测试结果以下结果为4皇后和8皇后问题的结果截图:(其中八皇后用红框标注的是测试数据)实验心得通过这次实验,我回顾了回溯法求解n皇后问题 本次实验由于对类并不是很熟悉,所以没有用到书上的代码,但是已经对n后问题很了解,因此自己写了一个较为容易理解的代码实现n后问题,算法也是用的回溯的思想:X(j)表示一个解的空间,j表示行数,里面的值表示可以放置在的列数,抽象约束条件得到能放置一个皇后的约束条件(1)X(i)!=X(k);(2)abs(X(i)-X(k))!=abs(i-k)。应用回溯法,当可以放置皇后时就继续到下一行,不行的话就返回到第一行,重新检验要放的列数,如此反复,直到将所有解解出,并将他们全部输出到屏幕上。通过本次实验发现,不管什么实验,如果自己已经了解了整个问题,并且掌握了算法思想,其实不需要看书上的算法,也可以会很轻松的写出一个正确代码的。 实验得分助教签名附录:完整代码#include iostream#include cmath#include time.h#include iomanip#includestdio.husing namespace std; bool place(int k, int *X){ int i; i=1; while(ik) { if((X[i]==X[k])||(abs(X[i]-X[k])==abs(i-k))) return false; i++; } return true;}void Nqueens(int n,int *X){ int k; X[1]=0;k=1; while(k0){ X[k]=X[k]+1; while((X[k]=n)(!place(k, X))) X[k]=X[k]+1; if(X[k]=n) if(k==n) { for(int i=1;i=n;i++) coutX[i] ; cout\n; } else{ k=k+1; X[k]=0; } else k=k-1; }}int main(){ int n; int *X; cout请输入皇后的个数:; cinn; X=new int[n]; cout问题的解有:endl; Nqueens(n,X);}
您可能关注的文档
- 300MWA卷.doc
- 3,20151125|10误区|离婚诉讼中的十大常见误区.doc
- 30题C语言.docx
- 31讲群落结构与演替学案.doc
- 3502运输顺槽回撤端头架过渡架安全技术措施.doc
- 31303末采封闭及综合措施.doc
- 40+64+40m连续梁预应力施工作业指导书.doc
- 4202副回撤通道贯通安全技术措施.doc
- 2多彩的光.doc
- 3会计信息系统报告.doc
- CNAS-CL63-2017 司法鉴定-法庭科学机构能力认可准则在声像资料鉴定领域的应用说明.docx
- 12J7-3 河北《内装修-吊顶》.docx
- 12N2 河北省12系列建筑标准设计图集 燃气(油)供热锅炉房工程.docx
- 内蒙古 12S8 排水工程 DBJ03-22-2014.docx
- 山西省 12S10 12系列建筑标准设计 管道支架、吊架.docx
- 16J601-木门窗标准图集.docx
- 12J8 河北省12系列《 楼梯》.docx
- CNAS-GL37 2015 校准和测量能力(CMC)表示指南.docx
- CNAS-RL02-2016 能力验证规则.docx
- 津02SJ601 PVC塑料门窗标准.docx
文档评论(0)