八皇后问题.docx
- 文档编号:5919090
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:9
- 大小:125.37KB
八皇后问题.docx
《八皇后问题.docx》由会员分享,可在线阅读,更多相关《八皇后问题.docx(9页珍藏版)》请在冰豆网上搜索。
八皇后问题
摘要:
八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击.按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子.因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。
该课程设计的目的是通过用C++语言平台将一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击的92种结构予以实现。
该课程设计使用非递归算法实现。
采用的思路大致是这样:
将一个皇后向下移动一个位置;如果没有成功移动(超出边界),失败;如果成功移动,则判断当前位置是否可用?
如果不可用,则重做1;继续给下一个皇后安排位置。
关键词:
八皇后;C++;非递归法
目录
1.课题综述1
1.1课题的来源及意义1
1.2面对的问题1
2.需求分析1
2.1涉及到的知识1
2.2软硬件的需求1
2.3功能需求2
3.概要设计3
4.详细设计和实现2
4.1算法描述及详细流程图2
4.1.1算法描述3
4.1.2算法流程图3
5.代码编写及详细注释4
6.程序调试7
6.1调试过程、步骤及遇到的问题7
7.运行与测试7
8.总结9
1.课题综述
1.1课题的来源及意义
八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。
在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。
所以高斯提出了一个问题:
在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。
在当今这个计算机技术的飞速发展的时代,这一古老而有趣的数学游戏问题也自然而然的被运用到计算机上。
通过所学计算机知识来试着解决这个问题,一方面可以锻炼和提高我们自己编程能力,另一方面也可以加强与同学老师之间的交流合作能力。
1.2面对的问题
1.2.1 解决冲突问题:
该问题包括了行,列,两条对角线;
列:
规定每一列放一个皇后,不会造成列上的冲突;
行:
当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;
对角线:
对角线有两个方向,在同一对角线上的所有点都不能有冲突
1.2.2用非递归算法解决问题。
2.需求分析
2.1涉及到的知识
本次课程设计中,用到的主要知识有:
非递归法的运用,for语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的掌握。
2.2软硬件的需求
语言平台:
c++语言平台
2.3功能需求
当运行程序时,在屏幕上显示每一种方法八个皇后的相对位置,要用比较直观的界面显示。
3.概要设计
本课件学生是用循环递归循环来实现的,分别一一测试了每一种摆法,并把它拥有的92种变化表现出来。
在这个程序中,我的主要思路以及思想是这样的:
1、解决冲突问题:
A:
将一个皇后向下移动一个位置;
B:
如果没有成功移动(超出边界),失败;如果成功移动,则判断当前位置是否可用?
如果不可用,则重做A;继续给下一个皇后安排位置。
2、数据结构。
(1)解数组A。
A[I]表示第I个皇后放置的列;范围:
1..8
(2)行冲突标记数组B。
B[I]=0表示第I行空闲;B[I]=1表示第I行被占领;范围:
1..8
(3)对角线冲突标记数组C、D。
C[I-J]=0表示第(I-J)条对角线空闲;C[I-J]=1表示第(I-J)条对角线被占领;范围:
-7..7
D[I+J]=0表示第(I+J)条对角线空闲;D[I+J]=1表示第(I+J)条对角线被占领;范围:
2..16
3、结束条件:
如果第一个皇后的所有位置都尝试完毕仍然没有可用的解决方案或者最后一个皇后已经安排完毕
4.详细设计和实现
4.1算法描述及详细流程图
4.1.1算法描述
1、数据初始化。
2、从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领):
如果是,摆放第n个皇后,并宣布占领(记得要横列竖列斜列一起来哦),接着进行递归;
如果不是,测试下一个位置(n,m+1),但是如果当n<=8,m=8时,却发现此时已经无法摆放时,便要进行回溯。
3、当n>;8时,便一一打印出结果。
4.1.2算法流程图
5.代码编写及详细注释
#include
#include
#include
usingnamespacestd;
structNode
{
intlevel;//X
intpos;//Y
};
intFind(Nodenode);
voidPrint();
intCurrent[9];//closetable
intNum;//keepthenumoftheans
stack
intmain()
{
inti;
Num=0;
Nodenode;//结点
Nodete;
for(i=8;i>=1;i--)
{
node.level=1;
node.pos=i;
//initalisexandy
My_stack.push(node);
}
//initalisestack
while(!
My_stack.empty()&&Num<=92)
{
node=My_stack.top();
Current[node.level]=node.pos;
if(!
Find(node))//找出当前节点的下一个节点,并且将它压人堆栈,返回1,否则返回0(没找到);
{
My_stack.pop();
te=My_stack.top();
while(node.level!
=te.level)
{
node=te;
My_stack.pop();
te=My_stack.top();
}
//如果当前层的最后一个都不行,则将上层的一个剔除
}//if
else
{
node=My_stack.top();
if(node.level==8)
{
Current[node.level]=node.pos;
Print();//输出组合,且Num++;
//将当前的节点弹出,一边扩展其他的节点。
My_stack.pop();
te=My_stack.top();
while(node.level!
=te.level)
{
node=te;
My_stack.pop();
te=My_stack.top();
}
}//if
}//else
}//mainwhile
return1;
}
intFind(Nodenode)
{
inti;
booltemp[9];
boolflag=false;
Nodeno;
for(i=1;i<=node.level;i++)
{
temp[Current[i]]=false;
if(Current[i]+i-node.level-1<9)
temp[Current[i]+i-node.level-1]=false;
if(Current[i]-i+node.level+1<9)//越界了
temp[Current[i]-i+node.level+1]=false;
}//for
for(i=1;i<9;i++)
{
if(temp[i]!
=false)
{
no.level=node.level+1;
no.pos=i;
My_stack.push(no);
flag=true;
}
}//for
if(flag)return1;
return0;
}
voidPrint()
{
inti,j;
Num++;
cout< "< for(i=1;i<9;i++) { for(j=1;j<9;j++) { if(j==Current[i]) cout<<"*"; elsecout<<"."; }//for cout< } getchar(); } 6.程序调试 6.1调试过程、步骤及遇到的问题 当非递归的算法代码输入完毕后后运行时有N多错误,这些错误有的是符号的输入格式有误,有的是头文件的引用没有完善: 例如: 当用printf输出时,经调试后,发现原来是缺少了stdio.h这样一个头文件。 还有的是函数的算法有误、逻辑错误导致程序死循环或不循环或循环是小部分,虽然编译时却没有错误,但是输出结果不正确。 通过和同学的多次交流现并在网上搜集了相关资料之后最后解决了问题。 7.运行与测试 总结 通过这次的课程设计,我从中学到了许多软件设计的思路和经验,提高了我们的创新能力。 通过对数据结构的深刻掌握,对我们选择一个好的算法是很重要的,可以锻炼我们的逻辑思维能力。 本次课程设计八皇后问题采用了非递归算法,虽然大大的增加了程序的复杂度,但是可以让我深深体会到一个问题的解决由于用到的数据结构不同,效率是不同的。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 皇后 问题