经济管理学院本科课程设计论文 1.2.2所用的知识
使用数据结构的知识,用递归法解决问题
1.3需求分析
1.3.1 涉及到的知识点
本次课程设计中,用到的主要知识有: 递归法的运用,for语句的灵活运用。
数据结构中树知识的灵活运用、栈及数组的掌握。
1.3.2 功能要求
当运行程序时,在屏幕上显示每一种方法八个皇后的相对位置,要用比较直观的界面显示。
进入界面后,就会提示输入字符串的输入形式,在八皇后求解程序中,只要你选择输出解的格式,选择1则显示为每一列皇后的放置的行数,,选择2则显示的是以矩阵形式形象的显示皇后的放置位置,选择0则退出程序的调试。在调试结果中,1的位置也就表示了该皇后应该所在的位置,0代表了空位置。
1.4概要设计
本课件学生是用循环递归循环来实现的,分别一一测试了每一种摆法,并把它拥有的92种变化表现出来。在这个程序中,我的主要思路以及思想是这样的:
- 2 -
第1章 八皇后问题 1.4.1解决冲突问题
这个问题包括了行,列,两条对角线;
列:规定每一列放一个皇后,不会造成列上的冲突;
行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要 把以I为下标的标记置为被占领状态;
对角线:对角线有两个方向。在这我把这两条对角线称为:主对角线和从对角线。在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。因此,当第I个皇后占领了第J列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。
1.4.2数据结构的实现
而对于数据结构的实现,学生则是着重于:
数组a[I]:a [I]表示第I个皇后放置的列;I的范围:1..8;
对角线数组:b[j](主对角线),c[j](从对角线),根据程序的运行,去决定主从对角线是否放入皇后
- 3 -
经济管理学院本科课程设计论文 1.4.3流程图
图1-1 算法流程图
1.5详细设计
解析:递归实现n皇后问题。
算法分析:
数组a、b、c分别用来标记冲突,a数组代表列冲突,从a[0]~a[7]代表第0列到第7列。如果某列上已经有皇后,则为1,否则为0。
数组b代表主对角线冲突,为b[i-j+7],即从b[0]~b[14]。如果某条主对角线上已经有皇后,则为1,否则为0。
数组c代表从对角线冲突,为c[i+j],即从c[0]~c[14]。如果某条从对角线上已经有皇后,则为1,否则为0。
代码如下:
- 4 -
第1章 八皇后问题 #include
static char Queen[8][8]; static int a[8]; static int b[15]; static int c[15];
static int iQueenNum=0; //记录总的棋盘状态数 void qu(int i); //参数i代表行 int main() {
int iLine,iColumn;
//棋盘初始化,空格为*,放置皇后的地方为@ for(iLine=0;iLine<8;iLine++) {
a[iLine]=0; //列标记初始化,表示无列冲突 for(iColumn=0;iColumn<8;iColumn++) Queen[iLine][iColumn]='*'; }
//主、从对角线标记初始化,表示没有冲突 for(iLine=0;iLine<15;iLine++) b[iLine]=c[iLine]=0; qu(0); return 0; }
void qu(int i)
{
int iColumn;
for(iColumn=0;iColumn<8;iColumn++) {
if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0) //如果无冲突 {
Queen[i][iColumn]='@'; //放皇后
a[iColumn]=1; //标记,下一次该列上不能放皇后
b[i-iColumn+7]=1; //标记,下一次该主对角线上不能放皇后 c[i+iColumn]=1; //标记,下一次该从对角线上不能放皇后
if(i<7) qu(i+1); //如果行还没有遍历完,进入下一行
else //否则输出
- 5 -
经济管理学院本科课程设计论文 {
//输出棋盘状态
int iLine,iColumn;
printf(\第%d种状态为:\\n\ for(iLine=0;iLine<8;iLine++)
{
for(iColumn=0;iColumn<8;iColumn++) printf(\ printf(\ }
printf(\ }
//如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重置
Queen[i][iColumn]='*';
a[iColumn]=0;
b[i-iColumn+7]=0; c[i+iColumn]=0; } } }
1.6调试分析及测试
1.6.1 遇到的问题及解决方法
由于对八个皇后放置的位置不能一次确定,而且前一个皇后的放置位置直接影响着后面的放置位置,使程序调试时要花费不少时间。
本程序有些代码重复出现,显得程序的有些代码看起来很杂乱。但其中最主要的问题是逻辑错误导致程序死循环或不循环或循环一小部分,但是编译时却没有错误,就是没有正确的输出答案。
- 6 -