北邮信通院数据结构实验二八皇后问题实验报告内附源代码完整版.docx
《北邮信通院数据结构实验二八皇后问题实验报告内附源代码完整版.docx》由会员分享,可在线阅读,更多相关《北邮信通院数据结构实验二八皇后问题实验报告内附源代码完整版.docx(12页珍藏版)》请在冰豆网上搜索。
北邮信通院数据结构实验二八皇后问题实验报告内附源代码完整版
数据结构实验报告
实验名称:
实验二一一八皇后问题
学生姓名:
班级:
班内序号:
学号:
日期:
2014年11月27日
1.实验要求
实验目的】
进一步掌握指针、模板类、异常处理的使用
掌握栈的操作的实现方法掌握队列的操作的实现方法学习使用栈解决实际问题的能力学习使用队列解决实际问题的能力
实验内容】
利用栈结构实现八皇后问题。
八皇后问题19世纪著名的数学家高斯于1850年提出的。
他的问题是:
在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。
请设计算法打印所有可能的摆放方法。
提示:
1、可以使用递归或非递归两种方法实现
2、实现一个关键算法:
判断任意两个皇后是否在同一行、同一列和同一斜线上
2.程序分析
2.1存储结构
存储结构:
栈(递归)
22关键算法分析
①递归调用摆放皇后
1、关键算法伪代码:
(1)•如果输入的row大于皇后的数量,则输出皇后的位置
(2)否则col从0开始递增
(3)检测(row,col)上的点是否符合条件,不符合则col自增,符合则转到下
一个皇后的排列
//摆放皇后
2、代码详细分析:
voidSeqStack:
:
PlaceQueen(introw)
for(intcol=0;col{
Push(col);
if(Check())//判断摆放皇后的位置是否合适
{
if(rowPlaceQueen(row+1);
else
{
num++;
//计数器加1
Print(n);
//打印成功的坐标点
}
}
Pop();
//若不符合条件则出栈
}
3、计算时间复杂度:
0(n2)
②判断皇后位置是否合适:
1、关键算法伪代码:
对于一个坐标,将前面每一个坐标均与这个坐标比较
若在同一列或在同一斜线上,则返回0,
否则j自增1,面每一个坐标与前面做比较
若与前面坐标在同一列
最后返回
2、代码分析:
boolSeqStack:
:
Check()
{
for(inti=0;i次检查前面已摆放的皇后位置
if(data[top]==data[i]||(abs(data[top]_data[i]))==(top_i))
在同一列同一斜线
returnfalse;
returntrue;
}
3、时间复杂度:
0(n)
2.3其他
说明:
由于输出显示时对话框有限,而程序结果比较多,占用空间大
来表示,则可以输出全部解。
3.程序运行结果
//依
//判断是否
,运用输出坐标位置
(1)程序框图:
(2)程序代码:
#includeusingnamespacestd;
constintm=1024;
大高度
intnum=0;
案种类计数器
intn;
个数
classSeqStack
//定义栈的最
//初始化方
//摆放的皇后
//定义
顺序栈
public:
SeqStack(){top=-1;}
//构造函
数,初始化空栈
voidPush(intx);
//入栈
voidPop();
//出栈
voidPlaceQueen(introw);
//摆放皇
后的递归函数
boolCheck();
//判断是否
在同一行同一列同一斜线
voidPrint(intn);
//打印
以坐标的形式
boolEmpty();//判别栈是否为空
//定义数组
//栈顶指
//入栈操作
private:
intdata[m];
inttop;
针
};
voidSeqStack:
:
Push(intx)
if(top>=m-1)throw"上溢”top++;
指针上移
data[top]=x;
}
//栈顶
voidSeqStack:
:
Pop()
{
if(Empty())throw"下溢"
//出栈操作
top--;
指针下移
//栈顶
voidSeqStack:
:
PlaceQueen(introw){
for(intcol=0;col{
Push(col);
if(Check())
//摆放皇后
II遍历0~7,
//判断摆放皇
后的位置是否合适
{
if(row最后一个,则进行下一个皇后的放置
PlaceQueen(row+1);
else
{
num++;
数器加1
Print(n);
功的坐标点
}
}
Pop();
符合条件则出栈
//若还没有放到
//计
//打印成
//若不
}
boolSeqStack:
:
Empty()
{
if(top==-1)
returntrue;
else
returnfalse;
}
boolSeqStack:
:
Check()
{
for(inti=O;i查前面已摆放的皇后位置
if(data[top]==data[i川(abs(data[top]_data[i]))==(top_i))
一列同一斜线
returnfalse;
returntrue;
}
//依次检
//判断是否在同
voidSeqStack:
:
Print(intn)
组形式打印成坐标
{
inti;
for(i=1;i<=n;i++)
cout<<"("<
cout<//将栈的数
voidmain()
{cout<<"输入Queen的数目(n>0)"<cin»n;
if(n<0||n>1024)
//定义类的对象
//从栈底开
//输出摆放方法的
{cout<<"输入错误"<SeqStackQueen;
Queen.PlaceQueen(0);
始赋值
cout<<"Queen可能的摆放位置种类:
"<总数
}
(3)运行结果:
»"E\vc++\MicH3MftVisualStudicAMyProjects侯验二\Debug\A皇氐Eire"<=>\^Ej
<14.4><2,7><3,5><4,2><5,&><64.1><7,3><8,9><1,4><2,7><3,5><4,3><5,1><6,6><7,8><8,2>Cl,4X2,8X3,1X4,3><5,6><6,2X7,7X8,5><1,4X2,8X3,1X4,5><5,7X6,2X7,6X8,3>Cl,4X2,8X3,5X4^35<5^1>C6,7><7^2X8,6>
<1,5><2,1><3,8><4,4>(5>2><6,?
>(?
3><8,6>Cl,5X2,l><3,8>C4,fi><5,3><6,7><7,2><8,4><1,5X2,2X3,4X4,6X5,8>C6,3X7,1X8r7><1,5><2,2><3,4>(4f7X5,3>C6,B><7,6><8,1><2>2><3J.6X4a>C5,7><6H><7J.e><1,5><2,2><3,BX^,1><5,4>C6,?
><7,3><8,6><1,5X2,3X3,1>C^,6X5,8><6,2X7,4X8,7>Cl,5X2,3X3,1X4,7X5,2><6,8X7,6X8,4><1,5X2,3X3,8X4.4?
<5,7X6,1X7,6X8,2>ajp5><2,7>OJ.l><4,3><5,B><6Jp6><7J.4>(l«5X2,7><3Jpl><4,4>C5Ji2>C6.S>C7J.G><8,3><1,5><2,7><3,2><4,4><5,8><6,1><7,3><8,6><1,5><2,7><3,2><4,6><5,3><6,1><7,4><8,8><1,5X2,7X3,2X4,6X5,3><6,1X7,8X8,4><1,5X2,7?
<3,4>(4F1?
<5,3><6,8X7,6X8,2><1,5X2,B><3J.4><^,l>C5,3>C6Jp6><7,2>Kl,5><2,a><3,4X4,lJ<5,7>C6,2><7,6><8,3>
<1,6><2,1><3,5><4,2><5,8><6,3><7,7><8,4>
4.总结
调试时出现的问题:
最初由于递归的思想未能很好掌握,导致几次调试都出现比较严重的错误;且在运用该方法时,未能将八皇后问题的具体思路搞清,没有考虑如果前次
的皇后放置错误导致后面的放置无论如何都不能满足要求,在设计递归算法总是只显示几
种,
为了将92种情形全部打印,采用坐标的形式。
使用了栈的存储结构来存储位置的纵坐标,不符合时将其出栈,要注意栈是否为空。
总结:
这次实验让我更好地掌握了栈思想以及函数的嵌套调用等等知识,以及一些书本
上没有的东西,让我学会了运用递归算法去解决一些复杂的问题。
另外,在写程序时,要
避免由于粗心造成的低级错误,减少调试的次数。
改进:
不仅可以设计放置八皇后,只要修改输入的N,便可显示其他情况的结果。