1、北京邮电大学信息与通信工程学院第 1 页数据结构实验报告实验名称: 实验二八皇后问题学生姓名: 班 级: 班内序号: 学 号: 日 期: 2014 年 11 月 27 日1 实验要求【实验目的】 进一步掌握指针、模板类、异常处理的使用 掌握栈的操作的实现方法 掌握队列的操作的实现方法 学习使用栈解决实际问题的能力 学习使用队列解决实际问题的能力【实验内容】利用栈结构实现八皇后问题。八皇后问题 19 世纪著名的数学家高斯于 1850 年提出的。他的问题是:在 8*8 的棋盘上放置 8 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。请设计算法打印所有可能的摆放方法。
2、提示:1、可以使用递归或非递归两种方法实现2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上2. 程序分析2.1 存储结构存储结构:栈(递归)北京邮电大学信息与通信工程学院第 2 页2.2 关键算法分析递归调用摆放皇后1、关键算法伪代码:(1).如果输入的 row 大于皇后的数量,则输出皇后的位置(2) 否则 col 从 0 开始递增(3) 检测( row,col)上的点是否符合条件,不符合则 col 自增,符合则转到下一个皇后的排列2、代码详细分析:void SeqStack:PlaceQueen(int row) /摆放皇后for (int col=0;colusing
3、 namespace std;const int m=1024; /定义栈的最大高度int num=0; /初始化方案种类计数器 int n; /摆放的皇后个数 class SeqStack /定义顺序栈public:SeqStack()top=-1; /构造函数,初始化空栈void Push(int x); /入栈void Pop(); /出栈void PlaceQueen(int row); /摆放皇后的递归函数北京邮电大学信息与通信工程学院第 5 页bool Check(); /判断是否在同一行同一列同一斜线void Print(int n); /打印以坐标的形式bool Empty()
4、; /判别栈是否为空private:int datam; /定义数组int top; /栈顶指针;void SeqStack:Push(int x) /入栈操作if(top= m-1) throw “上溢“;top+; /栈顶指针上移datatop=x;void SeqStack:Pop() /出栈操作if(Empty() throw “下溢“;top-; /栈顶指针下移void SeqStack:PlaceQueen(int row) /摆放皇后for (int col=0;col0)“n;if(n1024)cout“输入错误“endl;北京邮电大学信息与通信工程学院第 7 页SeqStac
5、k Queen; /定义类的对象Queen.PlaceQueen(0); /从栈底开始赋值cout“ Queen 可能的摆放位置种类:“numendl; /输出摆放方法的总数(3)运行结果:北京邮电大学信息与通信工程学院第 8 页北京邮电大学信息与通信工程学院第 9 页4. 总结调试时出现的问题: 最初由于递归的思想未能很好掌握,导致几次调试都出现比较严重的错误;且在运用该方法时,未能将八皇后问题的具体思路搞清,没有考虑“如果前次的皇后放置错误导致后面的放置无论如何都不能满足要求,在设计递归算法总是只显示几种,为了将92种情形全部打印,采用坐标的形式。使用了栈的存储结构来存储位置的纵坐标,不符合时将其出栈,要注意栈是否为空。总结:这次实验让我更好地掌握了栈思想以及函数的嵌套调用等等知识,以及一些书本上没有的东西,让我学会了运用递归算法去解决一些复杂的问题。另外,在写程序时,要避免由于粗心造成的低级错误,减少调试的次数。改进:不仅可以设计放置八皇后,只要修改输入的 N,便可显示其他情况的结果。