数据结果实验报告N皇后

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、实验目的

1)熟悉递归的定义和递归的算法设计。

2)加深对递归算法的理解,逐步培养解决实际问题的编程能力。

二、实验环境

在机房的电脑上,Visual C++ 6.0

三、实验内容

1、编写一个程序,求解皇后问题:在n×n的方格棋盘上,放置n个皇后,要求每个皇后不同行、不同列、不同对角线。

要求:使用递归算法求解;皇后的个数n由用户输入,其值不能超过20。

2、实验的程序如下:

#include

#include

const int N=20; /*最多皇后个数*/

int q[N]; /*存放各皇后所在的行号*/

int cont=0; /*存放解个数*/

void print(int n) { /*输出一个解*/

cont++;

int i;

printf(" 第%d个解:",cont);

for (i=1;i<=n;i++)

printf("%d ",q[i]);

printf("\n");

}

int find(int i,int k){ /*测试第k列的i行上能否摆放皇后*/ int j;

j=1;

while (j

if ((q[j]==i) || (abs(q[j]-i)==abs(j-k)))

/*第j列皇后是否在i行或(q[j],j)与(i,k)是否同对角线*/ return 0;

j++;

}

return 1;

}

void place(int k,int n) {/*第k个皇后放到第k列上*/

if (k>n)

print(n); /*所有皇后放置结束*/

else

for (int i=1;i<=n;i++) /*在第k列上穷举每一个位置*/

if (find(i,k)) {

q[k]=i;place(k+1,n);

}

}

void main(){

int n; /*n存放实际皇后个数*/

printf(" 皇后问题(n<20) n=");

scanf("%d",&n);

if (n>20)

printf("n值太大,不能求解\n");

else{

printf(" %d皇后问题求解如下:\n",n);

place(1,n);

printf("\n");

}

}

3、实验运行结果如下:

4、调试过程如下:

四、实验心得与小结

这次实验是用递归求解n皇后,递归平时训练的比较少,起初做的时候直接把void print(int n);int find(int i,int k);void place(int k,int n)写在了主函数的里边,造成了

的编译错误,但是不知道如何订正,尝试了各种方法,但都没有及其订正成功,静下心来回忆下递归的内容,递归的结构是较容易的,一个递归出口,一个递归体,一个递归的过程或递归的函数中递归调用语句是最后一句执行的,明白后主函数还是比较好写出,最主要的还是递归算法,可递归的算法对我来说不会太容易,虽然知道递归是用栈的存储,先进后出。借鉴了书上的例子,对书中的例子加以理解,于是很快的就完成这个实验了。经过这个实验我熟悉了递归的定义和递归的算法设计,加深对递归算法的理解,逐步培养了一点解决实际问题的编程能力。在今后的学习中还要继续加强对递归的训练,做到真的能用递归熟练解决实际问题。继续努力!

五、指导教师评议

成绩评定:指导教师签名:

相关文档
最新文档