北邮C 八皇后数据结构实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
显示全部92种方法,可以加一些控制语句使它分页显示92种
第 9页
if((q[j]==i) || abs(q[j]-i)==abs(j-k)) //判断列,判断斜线是否满足 条件
return 0; //不符合返回 0 j++; } return 1; //符合返回 }
1,首先声明一个Queen类,包含打印函数,找Queen位置函数以及判断位置是否合理函数; Print() Check(int i,int k) Queens(int k)
【实验内容】 利用栈结构实现八皇后问题。
八皇后问题 19 世纪著名的数学家高斯于 1850 年提出的。他的问题是:在 8*8 的棋盘上 放置 8 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线 上。请设计算法打印所有可能的摆放方法。
提示: 1、可以使用递归或非递归两种方法实现 2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上
if(k>n)//如果达到里要求的数量输出皇后排列
{ Print(n);
count();
}
else //否则在适当的位置添加一个新皇后
{
for(i=1;i<=n;i++)
if(Check(i,k)) //判断该行中该位置放置'皇后'是否符合要求
{
q[k]=i;
//记录改行中该点的位置
Queens(k+1,n); //放置下一行的'皇后'
第 2页
北京邮电大学信息与通信工程学院
}
else //否则在适当的位置添加一个新皇后
{
for(i=1;i<=N;i++)
百度文库
if(Check(i,k)) //判断该行中该位置放置'皇后'是否符合要

{
q[k]=i;
//记录改行中该点的位置
Queens(k+1); //放置下一行的'皇后'
}
}
}
void Queen::Print()
只显示 60 种到 92 种,可以运用输出坐标位置来表示,则可以输出全部解如:
void Queen::Print(int n) {
第 6页
北京邮电大学信息与通信工程学院
int i; for(i=1;i<=n;i++)
cout<<"("<<i<<","<<q[i]<<")"; cout<<endl; }
Queens(int k)函数:从第一个位置开始
第 4页
北京邮电大学信息与通信工程学院
2.1 存储结构
2.1 存储结构
1、
存储结构:栈(递归)
2.2 关键算法分析
1、递归
void Queen::Queens(int k,int n)//计算出皇后的排列,k 是当前皇后数量,n 是数量上

{ int i;
void Print();//输出皇后的排列 int Check(int i,int k);//判断位置是否符合要求 void Queens(int k);//递归调用 private: int q[N];//存储每个皇后位置 int num; }; void main() {
Queen Q; cout<<"Queen 可能的位置:"<<endl; Q.Queens(1);//从第一个皇后开始排 cout<<"共有 "<<m<<" 种方法放置 Queen"<<endl; } void Queen::Queens(int k)//计算出皇后的排列,k 是当前皇后数量 { int i; if(k>N)//如果达到里要求的数量输出皇后排列 { Print();
2.如果将92种情形全部打印,则前面的几十种情况将无法显示出,要想看到前面的状态,
第 8页
北京邮电大学信息与通信工程学院
必须添加一个控制语句,使其能一个一个的输出。 总结:这次实验让我更好地掌握了栈思想以及一维数组等等知识,以及一些书本上没有
的东西,让我学会了运用递归算法去解决一些复杂的问题 改进:不仅可以设计放置八皇后,也可以是9皇后,10皇后,只要修改N,目前程序无法
}
}
}
算法步骤:
(1).如果输入的 k 大于皇后的数量,则输出皇后的位置
(2)。否则 i 从 1 开始递增
第 5页
北京邮电大学信息与通信工程学院
(3),检测(k,i)上的点是否符合条件,不符合则 i 自增,符合则转到下一个皇后 的排列 时间复杂度:O(n²) 2、判断皇后放置位置是否符合要求 int Queen::Check(int i,int k) { int j; j=1; while(j<k) { if((q[j]==i) || abs(q[j]-i)==abs(j-k)) //判断列,判断斜线
return 0; //不符合返回 0 j++; } return 1; //符合返回 }
算法步骤:
1. 对于一个坐标,将前面每一个坐标均与这个坐标比较
2. 若在同一列或在同一斜线上,则返回 0,
3. 否则 j 自增 1,面每一个坐标与前面做比较
4. 若与前面坐标在同一列
5. 最后返回 1
2.3 其他 说明:由于输出显示时对话框有限,而程序结果比较多,占用空间大,最后
3. 程序运行结果 1 实验流程图
开始 输入 n
判断是否满行
判断位置(i,k) 是否符合要求 Y q[k]=i k++
Y 输出结果
N
N i++
2 测试条件:无特殊测试条件 3.实验结果:
第 7页
北京邮电大学信息与通信工程学院
4. 总结
调试时出现的问题:1. for与if的循环嵌套未能很好掌握,导致几次调试都出现比较严 重的错误;且在运用该方法时,未能将八皇后问题的具体思路搞清,没有考虑“如果前次的 皇后放置错误导致后面的放置无论如何都不能满足要求,在设计递归算法总是只显示几种,
{
cout<<"第"<<++m<<"种:";
for(int i=1;i<=N;i++)
{
cout<<endl;
for(int j=1;j<=N;j++)
{
if(j==q[i])
cout<<"Q ";
第 3页
北京邮电大学信息与通信工程学院
else cout<<"* ";
} } cout<<endl; } int Queen::Check(int i,int k) { int j; j=1; while(j<k) {
北京邮电大学信息与通信工程学院
数据结构实验报告
实验名称:实验二——栈和队列 学生姓名: 班 级: 班内序号: 学 号: 日 期:
1.实验要求
【实验目的】 1、 进一步掌握指针、模板类、异常处理的使用 2、 掌握栈的操作的实现方法 3、 掌握队列的操作的实现方法 4、 学习使用栈解决实际问题的能力 5、 学习使用队列解决实际问题的能力
2. 程序分析 #include<iostream> #include<cmath> using namespace std; const int N=8; //皇后的个数
第 1页
北京邮电大学信息与通信工程学院
static int m=0;//用来计数,使用方法数 class Queen { public:
相关文档
最新文档