实验6_迭代实现_物联1301班_刘悦_201308080112技术总结.docx

实验6_迭代实现_物联1301班_刘悦_201308080112技术总结.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
算法分析与设计实验报告 第 6 次实验 姓名刘悦学号201308080112班级物联1301班时间12.12上午地点工训楼C栋309 实验名称 回溯法实验(八皇后问题)实验目的掌握回溯法求解问题的思想。 学会利用其原理求解相关问题。实验原理使用迭代实现回溯法。 从第一行开始放置皇后,第一行从第一列开始放置。 之后放置第二行,与已放置的皇后冲突的位置不再考虑。 之后再放置后面行的皇后,一旦某一行无位置可放,就退回到上一行,选择后面的其他位置进行放置。之后再重复上面的过程。 一旦到达最后一行,就求得了解,记录这个时候的放置的信息。实验步骤 放置第一行的皇后。 放置后面行的皇后,与已放置的皇后在同一直线、横线、斜线的位置不能放置。 放置后面的皇后。一旦某一行无位置可放,就???回到上面一行,选择其他位置放置皇后。 一旦到达最后一行,意味着找到了一个可行解,就记录这个放置方案。 重复过程,直至找到所有可能的放置解。关键代码/*================================================================= 定义Queen类来存储皇后的信息。 =================================================================*/ class Queen { friend int nQueen(int); private: bool Place(int k); void Backtrack(void); int n;//皇后个数 int *x;//当前解 long sum;//当前已找到的可行方案数 }; /*================================================================= Place函数进行可行性约束。 若当前的位置已经与之前放置的皇后位置冲突,返回false;否则返回true。 若两皇后的斜率为-1或1则表示在同一斜线上就冲突,返回false。 ******************************************************************* k表示当前放置的皇后的行数。 x[k]表示第k行皇后放置的列数。即第k个皇后放在第x[k]列。 =================================================================*/ bool Queen::Place(int k) { for(int j=1;jk;j++) //abs(k-j)==abs(x[j]-x[k])时,两皇后在同一斜线上 if((abs(k-j)==abs(x[j]-x[k]))||(x[j]==x[k])) return false; return true; } /*================================================================= Backtrack函数迭代求皇后放置的位置。 如果已经放完最后一行,就将放置方案数加一,并将各个皇后放置的位置输出到记事本中 否则,就找一个可以放置的位置,然后进行下一行的放置。 这里使用迭代实现,使用k来记录当前的行数 如果某一行无位置可放,将回溯到前面一行,即k-- ,选择其他位置放置皇后。 ******************************************************************* k表示当前放置的皇后的行数。 x[k]表示第k行皇后放置的列数。即第k个皇后放在第x[k]列。 =================================================================*/ void Queen::Backtrack(void) { x[1]=0; int k=1; while(k0) { x[k]+=1;//第k行的放置皇后为第一列 //如果不满足约束条件就继续找后面一列看是否可放皇后 while((x[k]=n)!(Place(k))) x[k]+=1; //当前行有位置可放 if(x[k]=n) //已经放完最后一行的皇后 if(k==n) { sum++;//找到的放置方案数+1 //将具体放置方案写到记事本文件【N皇后_迭代.txt】中 static ofstream fout(N皇后_迭代.txt); fout第sum种方案:endl;

文档评论(0)

1112111 + 关注
实名认证
内容提供者

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

1亿VIP精品文档

相关文档