八皇后问题Word格式文档下载.docx
- 文档编号:18750234
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:9
- 大小:340.16KB
八皇后问题Word格式文档下载.docx
《八皇后问题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《八皇后问题Word格式文档下载.docx(9页珍藏版)》请在冰豆网上搜索。
=i<
=n,且1<
=xi<
=n)。
由于两个皇后不能位于同一列,所以n皇后问题的解向量必须满足约束条件xi!
=xj。
可以将n皇后问题的n*n棋盘看成是矩阵,设皇后i和皇后j的摆放位置分别是(i,xi)和(j,xj),则在棋盘上斜率为-1的同一条斜线上,满足条件i-xi=j-xj,在棋盘上斜率为1的同一条斜线上,满足条件i+xi=j+xj,综合上述两种情况,n皇后问题必须满足约束条件|i-j|!
=|xi-xj|。
设函数Queue实现任意N皇后问题,皇后k摆放在第k行第x[k]列的位置。
算法的伪代码描述如下:
算法:
Queue(n)
输入:
皇后的个数n
输出:
n皇后问题的解x[n]
初始化k=0,初始化解向量x[n]={-1};
(1)重复执行下述操作,摆放皇后k;
①把皇后k摆放在下一列的位置,即x[k]++;
②如果皇后k摆放在x[k]位置发生冲突,则x[k]++试探下一列,直到不冲突或者x[k]出界;
③如果x[k]没出界且所有皇后都摆放完毕,则输出一个解;
④如果x[k]没出界但尚有皇后没摆放,则k++,转
(1)摆放下一个皇后;
⑤如果x[k]出界,则回溯,x[k]=-1,k--,转
(1)重新摆放皇后k。
注:
本题只考虑八皇后问题。
2、代码:
#include<
stdio.h>
math.h>
constintN=8;
intx[N]={-1};
intPlace(intk)
{
for(inti=0;
i<
k;
i++)
if(x[i]==x[k]||abs(i-k)==abs(x[i]-x[k]))//违反约束条件
return1;
return0;
}
intmain()
intk=0,num=0;
while(k>
=0)
{
x[k]++;
while(x[k]<
8&
&
Place(k)==1)
x[k]++;
if(x[k]<
k==7)
{
printf("
第%d个解是:
"
++num);
for(inti=0;
8;
<
%d,%d>
\t"
i+1,x[i]+1);
\n"
);
}
else
if(x[k]<
k<
7)//上有皇后未摆放
k=k+1;
else
x[k--]=-1;
//重置x[k],回溯,重新摆放皇后k
}
return0;
结果:
3、各模块功能说明:
(1)Place:
放置皇后的位置。
(2)主函数:
4、总结:
通过这次的课程设计,让我了解了八皇后这一经典的问题。
同时让我更好地掌握了栈思想以及一维数组等知识,也包括一些书本上没有的东西,这对我以后的学习生涯以及将来步入社会起到很大的帮助。
这次课程设计虽然花了我一些时间和精力,但很值得,因为它对我能力提高起到很大帮助。
这次课程设计也提醒我以前知识的匮乏,它给我敲响了警钟,让我意识到自己基础的不扎实.当然这次实验还是有很多问题的。
这个学期数据结构的学习还是具有相当大的意义,它从一个程度上改变了我们的编程思想,如何将一个程序快速而又准备的进行编写,进行编译,都成为了我们思考的重点,也通过这一个学期的学习,我们将数据结构的思想带入到了我们以后的编程学习中去。
在这个阶段,我也明白了,好的思想,不能提留于字面上的认知,还需要的是平时多练多写一些相关的程序,并且通过修改,加入新的算法去尝试改变自己的一些编程思想。
保持更新算法的速度,这才是关键。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 皇后 问题