目录
一需求分析............................................ 错误!未定义书签。
1.1程序的功能:...................................... 错误!未定义书签。
1.2程序的输入输出要求:.............................. 错误!未定义书签。
二概要设计............................................ 错误!未定义书签。
2.1程序的主要模块:.................................. 错误!未定义书签。
2.2程序涉及:........................................ 错误!未定义书签。
三详细设计............................................. 错误!未定义书签。
3.1相关代码及算法..................................... 错误!未定义书签。
3.1.1 定义相关的数据类型如下:...................... 错误!未定义书签。
3.1.2 主模块类C码算法:............................. 错误!未定义书签。
3.1.3 画棋盘模块类C码算法........................... 错误!未定义书签。
3.1.4 画皇后模块类C码算法:........................ 错误!未定义书签。
3.1.5 八皇后摆法模块(递归法):.................... 错误!未定义书签。
3.1.6 初始化模块.................................... 错误!未定义书签。
3.1.7 输出摆放好的八皇后图形(动态演示):.......... 错误!未定义书签。
3.2相关流程图......................................... 错误!未定义书签。
四调试分析............................................. 错误!未定义书签。
五设计体会............................................ 错误!未定义书签。
六附录................................................ 错误!未定义书签。
七参考文献............................................ 错误!未定义书签。
一需求分析
1.1 程序功能:
八皇后问题是一个古老而著名的问题。
该问题是十九世纪著名的数学家高斯1850年提出的。
八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击.按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子,问有多少种不同的摆法?并找出所有的摆法。
因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。
本程序通过对子函数void qu(int i)的调用,将八皇后的问题关键通过数据结构的思想予以了实现。
虽然题目以及演算看起来都比较复杂,繁琐,但在实际中,只要当一只皇后放入棋盘后,在横与列、斜线上没有另外一只皇后与其冲突,再对皇后的定位进行相关的判断。
即可完成。
如果在这个程序中,我们运用的是非递归的思想,那么将大量使用if等语句,并通过不断的判断,去推出答案,而且这种非递归的思想,大大的增加了程序的时间复杂度。
如果我们使用了数据结构中的算法后,那么程序的时间复杂度,以及相关的代码简化都能取得不错的改进。
这个程序,我运用到了数据结构中的栈、数组,以及树和回溯的方法。
特别是在对于树以及二叉树的学习,更是为八皇后的问题提供了科学的解决方案,通过对树的分析,把八皇后的问题看成了树,而在衍生第一个变化后,上面的第一层八个变化就变成了八个结点,而这八个结点再继续的衍生……,这样比较形象的将八皇后的问题简单化了。
然后再通过回溯法进行设计,回溯法是设计递归过程的一个重要的方法。
它的求解过程实质上是一个先序遍历一棵“状态树“的过程。
在这个程序设计中,它先进行判断,棋盘上是否已经得到一个完整的布局(即棋盘是否已经摆上8个棋子),如果是,则输出布局;如果不是则依次先根遍历满足约束条件的各棵子树,流程即是:
判断该子树根的布局是否合法:如果合法的话,则先根遍历该子树;如果不合法的话,则剪去该子树的分支。
1.2 程序的输入输出要求:
用TC软件进行编译以及调试,调试正确之后,运行结果如下图:
输出结果如下图所示:
第1种情况
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
第92种情况
二概要设计
2.1 主要模块:
这个程序主要由4个模块组成,分别是画棋盘模块,画皇后模块,输出皇后摆法模块,和解决如何摆置皇后模块。
这4个模块隶属于主函数模块。
既主函数通过对这4个模块的合理调用解决“8皇后问题”,同时这4个模块之间也互有调用。
2.2 程序设计的数据结构及其关系:
数据结构的实现:数组a[i]:a [i]表示第i个皇后放置的列;i的范围:1-8;对角线数组:b[j](主对角线),c[j](从对角线),根据程序的运行,去决定主从对角线是否放入皇后;然后进行数据的初始化。
从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领):如果是,摆放第n个皇后,并宣布占领(切记要横列竖列斜列一起来),接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n<=8,m=8时,却发现此时已经无法摆放时,便要进行回溯。
三详细设计
3.1 定义相关的数据类型:
3.1.1 定义的相关数据类型:
int A[21],B[21],C[21],Y[8];
void *buff1,*buff2
3.1.2 设计思想:
本程序通过对子函数void qu(int i)的调用,将八皇后的问题关键通过数据结构。