算法分析与设计试验报告.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文档。上传文档
查看更多
中南大学算法分析与设计实验报告学 院:_ ____专业班级: 学 号: 姓 名: 指导教师: 2011年12 月实验一实现求n皇后问题和子集和数问题的回溯算法一 n皇后问题1、设计思想(1)为解决这个问题,我们把棋盘的横坐标定为i,纵坐标定为j,i和j的取值范围是从1到8。当某个皇后占了位置(i,j)时,在这个位置的垂直方向、水平方向和斜线方向都不能再放其它皇后了。(2)为第i个皇后选择位置的算法如下:for(j=1;j=8;j++) /*第i个皇后在第j行*/if ((i,j)位置为空)) /*即相应的三个数组的对应元素值为1*/{占用位置(i,j) /*置相应的三个数组对应的元素值为0*/if i8为i+1个皇后选择合适的位置;else 输出一个解}int iStart,iEnd;iStart = GetTickCount();//得到系统时间nQueen(n);iEnd = GetTickCount();//得到系统时间coutIt need iEnd-iStartms to solve the problem.\nendl;总而言之,通过这次实验,我更加明白了回溯法的设计思想。2、源代码:#include iostream.h#include windows.h#include math.h#include stdio.hclass Queen{friend int nQueen(int);bool Place(int k);void Backtrack(int t);void Output();int n,//皇后个数long sum;//当前已找到的可行性方案数};bool Queen::Place(int k){for (int j=1;jk;j++){if ((abs(k-j) == abs(x[k]-x[j])) || (x[j] == x[k])){return false;}}return true;}void Queen::Backtrack(int t){if (tn){sum++;Output();}else{for (int i=1;i=n;i++){x[t] = i;if (Place(t)){Backtrack(t+1);}}}}int nQueen(int n){Queen X;X.n = n;X.sum = 0;int *p = new int[n+1];for (int i=0;i=n;i++){p[i] = 0;}X.x = p;X.Backtrack(1);delete []p;return X.sum;}void Queen::Output(){cout\n***** 第sum图解 *****\n;cout┌;//head行for(int k=1;kn;k++)cout--┬;cout--┐\n;for (int i=1;i=n;i++){cout│;for (int j=1;j=x[i]-1;j++) cout │; cout⊙,x[i]+1;cout│; for (int j=x[i];j=n-1;j++) cout │; cout\n; if(in) {cout├;//间行 for(int k=1;kn;k++) cout--┼; cout--┤\n;} if(in-1) {cout└;//end行 for(int p=1;pn;p++) cout--┴; cout--┘\n; }}coutendl;}int main(){int n,m;cout\n\n请输入皇后的个数: ;cinn;int iStart,iEnd;m=nQueen(n);cout\n*** n皇后问题共 m 个解****endl;}运行截图:二1、子集和数问题的表示方案本设计利用大小固定的元组来研究回溯算法,在此情况下,解向量的元素X(i)取1或0值,它表示是否包含了权数W(i). 生成图中任一结点的儿子是很容易的。对于i级上的一个结点,其左儿子对应于X(i)=1,右儿子对应于X(i)=0。对于限界函数的一种简单选择是,当且仅当时,B(X(1),···,X(k))=true。显然,如果这个条件不满足,X(1),···,X(k)就不能导致一个答案结点。如果假定这些W(i)一开始就是按非降次序列排列的,那么这些限界函数可以被强化。在这种情况下,如果,则X(1),···,X(k)就不能导致一个答案结点。因此,将要使用的限界函数是B(X(1),···,X(k))=true,当且仅当。2主要数据类型与变量int M ; // 表示要求得到的子集和;int s; // 表示所选当前元素之前所选的元素和;int w[N]; // 存储原始集合的N个元素, 根据问题

文档评论(0)

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

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

1亿VIP精品文档

相关文档