C++八皇后问题
需求分析: 本程序主要解决的是: 在8行8列的棋盘上放置8个皇后,使任一个皇后都不能吃掉其他的7个皇后(注:皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子),并将结果以某种方式显示出来。
例如,当求出一个解时,可以如下信息来输出了表示摆放皇后的坐标位置以及“棋盘状态”:棋盘中有皇后的位置放一个“Q”字符,其他位置为“+”字符
程序代码中变量含义如下:
LineNum[9]表示第i列的皇后要放的行位置
a[i]为true表示i行上尚未放皇后
b[i]为true表示第i斜对角线上尚未放皇后
c[i]为true表示第i反斜对角线上尚未放皇后
2.2概要设计:
本程设计思路: 本程序主要分为两部分:位置确定solve()函数与主函数。
递归函数solve,它负责往第i列开始的连续8-i+1列上均放上皇后,若成功则通过引用参数ok返回true(否则返回false),原型如下void solve(int i, bool& ok);摆放皇后之后,若i=8即已放满时则递归出口;否则通过solve(i+1,ok);进行递归调用。从而当使用语句“if ( a[j] && b[i+j-2] && c[i-j+7] ) LineNum[i]=j;”时,可用于判断并实现:如果在第j行的第i列上放置皇后安全的话,则将一枚皇后放置到那儿。
编制主函数,首先初始化一个“空棋盘”,即将a、b、c数组的各元素均置为true(表示当前棋盘的8个行、15条斜对角线以及15条反斜对角线上都尚未摆放皇后)。而后执行调用语句“solve(1, ok);”,它负责往第1列开始的连续8列上均放上皇后,若成功则通过引用参数ok返回true(否则返回false)。
程序流程图(如下图):原文请找腾讯752018766辣,文-论'文.网http://www.751com.cn/
main()函数的流程图:
solve(int i,bool& ok)的流程图
2.3 详细设计与编码:
见上传程序。
2.4 调试分析:
在调试过程中程序遇到的问题如下:开始设计时不清楚问题解决的思路,通过仔细阅读题目给出的设计步骤及要求,及和骑士巡游问题比较;在solve函数的设计时遇到的问题很多,对函数的递归调用还是不熟悉,在递归条件的设计方面也有较大问题。solve函数基本上与骑士巡游问题的solve函数解决办法一致,难点是主函数的设计,涉及多重循环嵌套问题,经过非常细心的检查我才最终得到了题目所给出的结果说明
程序执行的结果:
本程序不需要用户输入任何限制条件和起始数据,但要阅读程序需要清楚其中的变量说明。主要变量意义如下:
LineNum[9]表示第i列的皇后要放的行位置
a[i]为true表示i行上尚未放皇后
b[i]为true表示第i斜对角线上尚未放皇后
c[i]为true表示第i反斜对角线上尚未放皇后
2.6 设计心得:
本程序设计虽然与实际问题相联系,从题目来看不易理解,但是实现时主要运用函数递归调用的知识。而且在解决骑士巡游问题的基础上,本题更容易实现,只是比骑士巡游问题多了一些约束条件。在递归时应该特别注意约束条件的设置,还应该注意输出内容的设计以及程序每执行一步的结果。本次实验使我体会到现实问题中有很多相近的解法,认识到了多做一些程序设计能够增加自己的思路和有助于经验的积累。1832