数据结构课程设计八皇后问题.pdf
《数据结构课程设计八皇后问题.pdf》由会员分享,可在线阅读,更多相关《数据结构课程设计八皇后问题.pdf(18页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、目 录 1、课程设计的目的1 2、课程设计的要求1 3、课程设计的内容1 3.1 设计的内容1 3.2 算法思路1 3.2.1 算法的内容1 3.2.2 算法中函数的流程图1 3.3 程序调试与测试以及结果的分析3 3.3.1 详细设计3 3.3.2 遇到的问题及解决方法6 3.3.3 算法的时空分6 3.3.4 结果分析6 3.3.5 算法的改进6 3.3.6 程序使用说明6 3.3.7 测试结果7 4、总结10 5、参考文献10 6、附录11 1 八皇后问题 1、课程设计的目的(1)了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(2)初步掌握软件开发过程的问题分析、系统
2、设计、程序编码、测试等基本方法和技能;(3)提高综合运用所学的理论知识和方法独立分析和解决问题的能力;(4)训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风;2、课程设计的要求(1)设计的课题能够体现数据结构和算法的算法分析、设计、算法实现。(2)根据自己对数据结构和算法的基本概念、原理和机制的理解,自拟题目和设计内容,选题尽可能结合实际的应用。3、课程设计的内容 3.1 设计的内容 八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯 1850 年提出的,并作了部分解答。高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有 76 种不
3、同的放法,这就是有名的“八皇后”问题。在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在8*8 的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。现在我们已经知道八皇后问题有 92个解答。我要设计的程序就是怎样把 92 种解答直观清晰的让大家了解和认识。3.2 算法思想 3.2.1 算法的内容(1)解数组 a,ai表示第 i 个皇后放置的列,范围为 18。(2)行冲突标记数组 b,bj=0 表示第 j 行空闲,bj=1
4、 表示第 j 行被占领,范围为 18。(3)对角线冲突标记数组 c、d。ci-j=0 表示第(i-j)条对角线空闲,ci-j=1 表示第(i-j)条对角线被占领,范围-77。di+j=0 表示第(i+j)条对角线空闲,di+j=1 表示第(i+j)条对角线被占领,范围 216。(4)抽象数据类型的定义 Print()/打印每一列皇后的放置的行数以及以矩阵形式形象的显示皇后的放置位置 JudgeQueen1()/递归寻找摆放皇后位子 void main()/主函数调用 3.2.2 算法中函数的流程图(1)数据初始化。(2)从 n 列开始摆放第 n 个皇后(因为这样便可以符合每一竖列一个皇后的要求
5、),先测试当 2 前位置(n,m)是否等于 0(未被占领)。如果是,摆放第 n个皇后,并宣布占领(记得姚横列竖列斜列一起设置),接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当 n8时,便打印出结果。其算法流程图如下:N Y Y N 开始 数据初始化 1 2 从 n 列开始摆放第 n 个皇后 开始 从第 n 列开始摆放第 n 个皇后 摆放皇后,并 宣布占领 测试下个位置 m=m+1 当前位置(n,m)是否被占领 n=n+1 摆放皇后,并 宣布占领 当前位置(n,m)是否被占领 n=n+1 摆放皇后,并 宣布占领 当前位置(n,m)是否被占领 0打印 结果 进行回溯 n=8&m=
6、8 3 3.3程序调试与测试以及结果的分析 3.3.1详细设计/定义数组 int a8;/表示第 i 个皇后放置的列,范围为 18。int b8;/表示第 j 行空闲,bj=1 表示第 j 行被占领,范围为 18 int c30;/表示第(i-j)条对角线空闲,ci-j=1 表示第(i-j)条对角线被占领,范围-77 int d30;/表示第(i+j)条对角线空闲,di+j=1 表示第(i+j)条对角线被占领,范围216。/位置标明法打印 void print1()X+;couttNo.X:;/每一行皇后放置的列数的第 X 种情况 for(k=1;k9;k+)cout ak;coutn;/矩阵
7、表示法打印 void print2()int t,n;Y+;couttNo.Y:nt;/矩阵形式的第 Y 种情况 for(k=1;k9;k+)n=ak;for(t=1;tn;t+)cout0;cout1;t+;for(t;t9;t+)cout0;coutnt;coutn;/回溯递归法摆放皇后 void PlaceQueen1(int i)4 int j;for(j=1;j9;j+)/每个皇后都有 8 种可能位置 if(bj=0)&(ci+j=0)&(di-j=0)/判断位置是否冲突 ai=j;/摆放皇后 bj=1;/宣布占领第 J 行 ci+j=1;/占领两个对角线 di-j=1;if(i8)
8、PlaceQueen1(i+1);/8 个皇后没有摆完,递归摆放下一皇后 else print1();/完成任务,打印结果 bj=0;/回溯 ci+j=0;di-j=0;void PlaceQueen2(int i)int j,e=1;for(j=1;j9;j+)if(bj=0)&(ci+j=0)&(di-j=0)ai=j;bj=1;ci+j=1;di-j=1;if(i8)PlaceQueen2(i+1);else print2();/打印结果 bj=0;/回溯 ci+j=0;di-j=0;e+;/调用主函数 void main()5 coutnnt*Welcome to EightQueen
9、 inquiries software problems*nn;for(k=0;k24;k+)/数据初始化 bk=0;ck=0;dk=0;ch=y;while(ch=y|ch=Y)coutnt 查 询 菜 单n;coutnt*;coutnt*No.1-每一行皇后放置的列数的情况 *;coutnt*No.2-视图矩阵形式显示皇后的位置 *;coutnt*No.0-退 出 *;coutnt*;coutchoice;switch(choice)case 1:coutnt 每一行皇后放置的列数的情况nn;PlaceQueen1(1);/从第 1 个皇后开始放置 break;case 2:coutnt
10、使用回车查看下一种情况nn;PlaceQueen2(1);/从第 1 个皇后开始放置 break;case 0:ch=n;break;default:coutntt 菜单选择错误,请重新输入!n;6 3.3.2遇到的问题及解决方法(1)由于对八个皇后放置的位置不能一次确定,而且前一个皇后的放置位置直接影响着后面的放置位置,使程序调试时要花费不少时间。(2)本程序有些代码重复出现,显得程序的有些代码看起来很杂乱。但其中最主要的问题是逻辑错误导致程序死循环或不循环或循环一小部分,但是编译时却没有错误,就是没有正确的输出答案。比如说,在 void print2()中有 for(t;t9;t+),如果
11、赋 t=1,则在视图显示法中会出现排序紊乱。类似的还有出现死循环的问题,后在同学们的帮助下,经细心改正后才把调试工作做完。(3).这里在编写回溯算法时候需要特别注意以下几点:回溯循环的结束在于第一个皇后被回溯。当找到一个解时,需要复制整个棋盘,不然接下来的回溯将破坏已经找到的解。找到一个解后,需要在当前皇后的基础上回溯。回溯一个皇后时,要对当前的列数进行重置。一般在编写完核心代码后,需要编写一定的测试代码进行单元测试。否则的话,后面出现的错误的程序代码问题是好难修正的!3.3.3 算法的时空分析 该算法的运行时间和和皇后的放置方法成正比,在最好情况下的时间和空间复杂度均为O(1),在最差情况下
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 皇后 问题
限制150内