八皇后问题.docx
《八皇后问题.docx》由会员分享,可在线阅读,更多相关《八皇后问题.docx(9页珍藏版)》请在冰豆网上搜索。
![八皇后问题.docx](https://file1.bdocx.com/fileroot1/2022-12/31/db113db8-4497-47a6-9bd0-3635786c4ae1/db113db8-4497-47a6-9bd0-3635786c4ae11.gif)
八皇后问题
一、八皇后问题
设计程序完成如下要求:
在8×8的国际象样棋盘上,放置8个皇后,使得这8个棋子不能互相被对方吃掉。
要求:
1)依次输出各种成功的放置方法。
2)最好能画出棋盘的图形形式,并在其上动态地演示试探过程。
1、总思想:
显然,棋盘的每一行可以且必须摆放一个皇后,可以用向量(x1,x2,……,xn)表示n皇后问题的解,即第i个皇后摆放在第i行第xi列的位置(1<=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
#include
constintN=8;
intx[N]={-1};
intPlace(intk)
{
for(inti=0;iif(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]<8&&k==7)
{
printf("第%d个解是:
",++num);
for(inti=0;i<8;i++)
printf("<%d,%d>\t",i+1,x[i]+1);
printf("\n");}
else
if(x[k]<8&&k<7)//上有皇后未摆放
k=k+1;
else
x[k--]=-1;//重置x[k],回溯,重新摆放皇后k
}
return0;
}
结果:
3、各模块功能说明:
(1)Place:
放置皇后的位置。
(2)主函数:
4、总结:
通过这次的课程设计,让我了解了八皇后这一经典的问题。
同时让我更好地掌握了栈思想以及一维数组等知识,也包括一些书本上没有的东西,这对我以后的学习生涯以及将来步入社会起到很大的帮助。
这次课程设计虽然花了我一些时间和精力,但很值得,因为它对我能力提高起到很大帮助。
这次课程设计也提醒我以前知识的匮乏,它给我敲响了警钟,让我意识到自己基础的不扎实.当然这次实验还是有很多问题的。
这个学期数据结构的学习还是具有相当大的意义,它从一个程度上改变了我们的编程思想,如何将一个程序快速而又准备的进行编写,进行编译,都成为了我们思考的重点,也通过这一个学期的学习,我们将数据结构的思想带入到了我们以后的编程学习中去。
在这个阶段,我也明白了,好的思想,不能提留于字面上的认知,还需要的是平时多练多写一些相关的程序,并且通过修改,加入新的算法去尝试改变自己的一些编程思想。
保持更新算法的速度,这才是关键。