- 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);}
文档评论(0)