八皇后问题是一个古老而著名的问题.doc_第1页
八皇后问题是一个古老而著名的问题.doc_第2页
八皇后问题是一个古老而著名的问题.doc_第3页
八皇后问题是一个古老而著名的问题.doc_第4页
八皇后问题是一个古老而著名的问题.doc_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

八皇后问题是一个古老而著名的问题,它是回溯算法的典型例题。该问题是十九世纪德国著名数学家高斯于1850年提出的:在8行8列的国际象棋棋盘上摆放着八个皇后。若两个皇后位于同一行、同一列或同一对角线上,则称为它们为互相攻击。在国际象棋中皇后是最强大的棋子,因为它的攻击范围最大,图6-15显示了一个皇后的攻击范围。图6-15 皇后的攻击范围现在要求使这八个皇后不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。现代教学中,把八皇后问题当成一个经典递归算法例题。图6-16显示了两种八个皇后不相互攻击的情况。图6-16八个皇后不相互攻击的情况现在来看如何使用回溯法解决八皇后问题。这个算法将在棋盘上一列一列地摆放皇后直到八个皇后在不相互攻击的情况下都被摆放在棋盘上,算法便终止。当一个新加入的皇后因为与已经存在的皇后之间相互攻击而不能被摆在棋盘上时,算法便发生回溯。一旦发生这种情况,就试图把最后放在棋盘上的皇后移动到其他地方。这样做是为了让新加入的皇后能够在不与其它皇后相互攻击的情况下被摆放在棋盘的适当位置上。例如图6-17所示的情况,尽管第7个皇后不会与已经放在棋盘上的任何一皇后放生攻击,但仍然需要将它移除并发生回溯,因为无法为第8个皇后在棋盘上找到合适的位置。图6-17 需要发生回溯的情况算法的回溯部分将尝试移动第7个皇后到第7列的另外一点来为第8个皇后在第8列寻找一个合适的位置。如果第7个皇后由于在第7列找不到合适的位置而无法被移动,那么算法就必须去掉它然后回溯到第6列的皇后。最终算法不断重复着摆放皇后和回溯的过程直到找到问题的解为止。下面给出了求解八皇后问题的示例程序。#include #include using namespace std;/ 首先 要求皇后不冲突,那么每行只应该有一个皇后/ 用queens数组在存储每个皇后的位置/ 例如: queensm = n 表示 第m行的皇后放在第n列上#define MAX 8int sum = 0;class QueenPuzzleint queensMAX; / 存储每行皇后的列标public:void printOut(); / 打印结果int IsValid(int n); /判断第n个皇后放上去之后,是否合法void placeQueen(int i); / 递归算法 放置皇后;void QueenPuzzle:printOut()for(int i=0; iMAX; i+)for(int j=0; jMAX; j+)if(j = queensi)cout Q ;elsecout 0 ;cout endl;cout endl 按q键盘退出,按其他键继续 endl endl;if(getch() = q)exit(0);/ 在第i行放置皇后void QueenPuzzle:placeQueen(int i)for(int j=0; jMAX; j+)/ 如果全部放完了 输出结果if(i = MAX)sum +;cout 第 sum 组解: endl;printOut();return;/ 放置皇后queensi = j;/ 此位置不能放皇后 继续试验下一位置if(IsValid(i)placeQueen(i+1);/判断第n个皇后放上去之后,是否合法,即是否无冲突int QueenPuzzle:IsValid(int n)/将第n个皇后的位置依次于前面n1个皇后的位置比较。for(int i = 0 ; i n ; i+)/两个皇后在同一列上,返回0if(queensi = queensn)return 0;/两个皇后在同一对角线上,返回0if(abs(queensi - queensn) = (n - i)return 0;/没有冲突,返回1。return 1;void main()QueenPuzzle queen;queen.placeQueen(0);cout 共 sum 组解 endl;由于回溯法也是在试图搜索整个解空间中的所有可能的选择,于是有人会误认为回溯法与穷举法差不多,但事实上回溯法要较穷举法在效率上高出很多。这里就以一种简单的估算方法来对八皇后问题进行一下分析。首先采用穷举法,那么可以容易得出该问题的解空间的结点总数为109601。然后在使用回溯法的前提下随机选取20条路径,分别估计它们的结点个数并求得总数的平均值。因为已知八皇后问题共有92种解,所以选择20种随

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论