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

合集下载

数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河

数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河

数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河实验报告:数据结构与算法专题实验报告实验题目:八皇后问题的求解与背包问题的求解实验目的:1. 掌握八皇后问题的求解方法,了解回溯算法的应用。

2. 掌握背包问题的求解方法,了解动态规划算法的应用。

3. 进一步理解数据结构与算法的基本概念和应用。

实验内容:1. 八皇后问题的求解八皇后问题是一个经典的递归与回溯算法问题,要求在一个8×8的棋盘上放置8个皇后,使得任意两个皇后不在同一行、同一列或同一斜线上。

具体求解步骤如下:a. 定义一个8×8的二维数组作为棋盘,初始化所有元素为0。

b. 从第一行开始,依次尝试在每一列放置皇后。

c. 对于每一列,判断当前位置是否与已经放置的皇后冲突。

如果冲突,则回溯到上一行,重新选择位置;否则,继续放置下一行的皇后。

d. 当放置完所有皇后时,输出结果。

2. 背包问题的求解背包问题是一个经典的动态规划算法问题,要求在给定的一组物品中选择一些物品放入背包,使得背包的总重量最大,但不能超过背包的承重量。

具体求解步骤如下:a. 定义一个二维数组dp,其中dp[i][j]表示在前i个物品中选择,背包容量为j时的最大重量。

b. 初始化dp数组的第一行和第一列为0,表示背包容量为0时和没有物品可选时的最大重量都为0。

c. 对于每个物品,分两种情况讨论:- 如果当前物品的重量大于背包的容量,则无法选择该物品,直接继承前i-1个物品的最大重量,即dp[i][j] = dp[i-1][j];- 如果当前物品的重量小于等于背包的容量,则可以选择该物品或不选择该物品。

选择该物品时,背包的总重量为dp[i-1][j-w[i]] + v[i],不选择该物品时,背包的总重量为dp[i-1][j]。

取两者中的较大值作为dp[i][j]的值。

d. 最终,dp[n][m]即为所求的最大重量,其中n为物品的个数,m为背包的承重量。

数据结构 八皇后问题 报告

数据结构 八皇后问题 报告

数据结构实验报告实验名称:实验2 利用栈结构实现八皇后问题学生姓名:廖宁班级:2009211114班内序号:18学号:09210411日期:2010年11月18日1.实验要求八皇后问题是19世纪著名的数学家高斯于1850年提出的。

他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。

请设计算法打印所有可能的摆放方法。

提示:(1)可以使用递归或非递归两种方法实现。

(2)实现一个关键算法,判断任意两个皇后是否在同一行、同一列和同一斜线上。

2. 程序分析程序工程包含一个模板类函数实现定义的源文件forthelove.cpp和测试源文件sbsuowang.cpp。

2.1 存储结构存储结构为栈。

2.2 关键算法分析(1)判断在第row行第column列摆放皇后是否非法,采取定行不定列的方法,列相等的算法为position[i]=colume,对角线相等有两种情况:一是position在上则row-i=colume-position[i];二是position在下,row-i=position[i]-colume.加入能放皇后,列和对角线上值都不能相等。

具体代码如下:int IsIllegal(int row, int column, const int* position){/int i;for (i=1; i < row; ++i){if ((position[i] == column)|| (row - i == column - position[i])|| (row - i == position[i] - column)){return TRUE;}}return FALSE;}(2)我采用定行尝试列的方法来遍历,记录皇后位置的数组可以和栈数组合二为一,而栈顶指针也可以和行坐标合二为一,这样一来栈帧只要一个列坐标就可以了。

1.伪代码:while(栈不空){if ( 行(即栈顶) <= n && 列<= n ){if ( 当前位置不能放皇后){列++;}else{列入栈(隐含着"行++");列= 1;}}else{if ( 行(即栈顶) > n ){输出位置数组(即栈数组);}列退栈(隐含着"行--");列++;}}//end while具体实现代码:void Queens(int n, void (* Visit)(const int* position)) {//position[n]数组:position[0]为棋盘大小,即n//position[1]~position[n]:下标为行坐标,值为列坐标int* stack = NULL; //栈int top; //栈顶int column; //列stack = (int*)malloc((n + 1) * sizeof(int));stack[0] = n;top = column = 1;while(top > 0){if ((top <= n) && (column <= n)){if (IsIllegal(top, column, stack)){++column;}else{stack[top++] = column;column = 1;}}else{if (top > n){(* Visit)(stack);}column = stack[--top];++column;}}//end whilefree(stack);return;}3. 程序运行结果程序实现八皇后问题:经过测试,程序运行良好,无明显错误。

c八皇后问题课程设计报告范文

c八皇后问题课程设计报告范文

c八皇后问题课程设计报告范文八皇后问题一、设计任务与目标在8行8列的棋盘上放置8个皇后,皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子,要使任一个皇后都不能吃掉其他的7个皇后,则需要同时控制同行,同列,同一条对角线的情况,然后当行,列,以及对角线都无皇后时,记录该点。

并用“Q”表示皇后的位置,“+”表示其它位置。

二、方案设计与论证定义4个具有全局作用域的数组intLineNum[9];boola[9],b[15]分别表示第几列的皇后要放的行位置,第几行上是否未放皇后,“/”斜对角线上是否未放皇后,“\\”反斜对角线上是否未放皇后。

通过语句“if(a[j]&&b[i+j-2]&&c[i-j+7])LineNum[i]=j;”判断并实现一枚皇后是否放置安全。

然而当第一枚皇后位置放置后,则它所在的行,列,以及对角线的记录状态需要改变后,才能进行下一枚皇后的放置。

下一枚皇后判断位置的步骤与第一枚一样,所以可以用递归的方法进行下一枚皇后位置的放置。

当第8枚皇后的位置确定后,就跳出递归。

之后还要对之前每一个位置记录的情况初始化才能进行下一种放置八皇后的情况。

三、程序框图或流程图,程序清单与调用关系Inti=1i>8否是Intj=1;否j<9是j++输出并显示八皇后摆放情况a[j]&&b[i+j-2]&&c[i-j+7]是否跳出递归j++LineNum[i]=j;a[j]=fale;b[i+j-2]=fale;c[i-j+7]=fale;i++;i--a[j]=true;b[i+j-2]=true;c[i-j+7]=true;否i<2是四、全部源程序清单#include#includeintLineNum[9];//第i列的皇后要放的行位置(只用其中的列号1到8)boola[9];//a[i]为1表示第i行上尚未放皇后boolb[15];//b[i]为1表示第i条斜对角线上尚未放皇后(斜对角线指的是\状对角线,该对角线上各点的行列号之和i+j为一个常数)boolc[15];//c[i]为1表示第i条反斜对角线上尚未放皇后(反斜对角线指的是\状对角线,该对角线上各点的行列号之差i-j为一个常数)。

数据结构实验报告八皇后问题

数据结构实验报告八皇后问题

2007级数据结构实验报告实验名称:实验二——栈和队列学生姓名:班级:班内序号:学号:日期:2008年11月18日1.实验要求通过选择下面五个题目之一进行实现,掌握如下内容:➢进一步掌握指针、模板类、异常处理的使用➢掌握栈的操作的实现方法➢掌握队列的操作的实现方法➢学习使用栈解决实际问题的能力➢学习使用队列解决实际问题的能力利用栈结构实现八皇后问题。

八皇后问题19世纪著名的数学家高斯于1850年提出的。

他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。

请设计算法打印所有可能的摆放方法。

提示:1、可以使用递归或非递归两种方法实现2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上2. 程序分析2.1 存储结构采用栈存储,其结构图如下:2.2 关键算法分析函数原型: bool check(int i);2.2.1.1.1自然语言:检测至第i行所摆放的第i个皇后是否和之前的i-1个皇后发生冲突。

如是,则返回0;反之,则当前布局合法,返回1。

判断两个皇后是否相互攻击的准则是:若两个皇后处于同一行,或处于同一列,或处于同一斜线,就能相互攻击。

基于如上准则,函数check( )的工作原理是:考虑到数组的每个元素分别代表不同行的皇后,即每行只放置了一个皇后,所以不必考虑“同处一行相互攻击”的情形;对于同处一列,则语句:if(queen[s]==queen[t])就能判断出不同行的两个棋子是否同处一列;对于处于同一斜线的这种情况,首先,我们看出国际象棋的棋盘是一个八行八列的正方形。

因此我们可将棋盘想象为数学上的笛卡尔平面坐标系,两颗棋子想象为平面上的两个点,就很容易发现,为保证两颗棋子不处于同一斜线,只要过这两个点的直线斜率不为1或-1,就能达到要求。

由此可使用下列语句:if( abs(t-s) == abs(queen[s]-queen[t]) )其中t和s分别代表不同行的两个皇后,即数组queen[8]里不同下标的两个元素。

北邮信通院数据结构实验二--八皇后问题实验报告(内附源代码完整版)

北邮信通院数据结构实验二--八皇后问题实验报告(内附源代码完整版)
2.程序分析
2.1存储结构
存储结构:栈(递归)
2.2关键算法分析
递归调用摆放皇后
1、关键算法伪代码:
(1).如果输入的row大于皇后的数量,则输出皇后的位置
(2)否则col从0开始递增
(3)检测(row,col)上的点是否符合条件,不符合则col自增,符合则转到下一个皇后的排列
2、代码详细分析:
void SeqStack::PlaceQueen(int row) //摆放皇后
{
for (int col=0;col< n;col++) //遍历0~7,
{
Push(col);
if (Check()) //判断摆放皇后的位置是否合适
{
if (row< n-1) //若还没有放到最后一个,则进行下一个皇后的放置
PlaceQueen(row+1);
else
{
num++; //计数器加1
{
if(top>= m-1) throw "上溢";
top++; //栈顶指针上移
data[top]=x;
}
void SeqStack::Pop() //出栈操作
{
if(Empty()) throw "下溢";
top--; //栈顶指针下移
}
void SeqStack::PlaceQue计放置八皇后,只要修改输入的N,便可显示其他情况的结果。
Print(n); //打印成功的坐标点
}
}
Pop(); //若不符合条件则出栈
}
}
bool SeqStack::Empty()

数据结构实验报告--八皇后

数据结构实验报告--八皇后

数据结构实验报告1.实验要求实验目的:利用栈结构实现八皇后问题八皇后问题如下:八皇后问题是19世纪著名的数学家高斯于1850年提出的。

他的问题是,在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行,同一列,同一斜线上。

实验内容:利用所学的栈结构用递归或非递归解决八皇后问题。

2. 程序分析程序使用程序最主要只是在主函数用了一个递归函数Queen。

Queen函数使用了三个参数m,flag[][],chess[][]。

其中m是行数,flag[][]是判断二维数组何处可以放置皇后,chess[][]是存储字符串的二维数组。

主函数中对Queen函数中的形参数组flag[][],chess[][]进行初始化,在Queen函数中再进行各种操作。

Queen函数执行代码,首先行数m为0,当m小于7时,通过if…else…语句,利用Queen(m+1,f,c)重新执行递归函数到下一行。

2.1 存储结构存储结构:数组存储。

flag[][]数组存储数字判断输出和储能放置皇后,chess[][]数组存储字符串即皇后和非皇后的形状。

2.2 关键算法分析1、关键算法:a.for(i=0;i<8;i++)for(j=0;j<8;j++){f[i][j]=0;c[i][j]='*';说明:对棋盘进行初始化未放置皇后的为“*”b.for(i=0;i<8;i++)for(j=0;j<8;j++){c[i][j]=chess[i][j];f[i][j]=flag[i][j];}说明:对c[][],f[][]进行初始化。

c.for(i=0;i<8;i++)for(j=0;j<8;j++){i f(f[i][j]==0 && (i+j==m+k || m==i || k==j || m-k==i-j))f[i][j]=-1;}c[m][k]='#';说明:已放置皇后的行、列以及对角线都不能再放置皇后。

八皇后问题实验报告

八皇后问题实验报告

软件工程上机报告实验名称:八皇后问题图形界面求解姓名:郭恂学号:2011011435班级:11级数学班中国石油大学(北京)计算机科学与技术系一、试验程序截图:点击显示下一组解即可显示下一组解:同样的,如果点击上一组解即可显示上一组解。

若在第1组解时点击显示上一组解会弹出报错提示框。

同样,若在第92组解点击显示下一组解也会弹出报错提示框:二、程序代码程序使用Java语言编写,编写环境为jdk1.6.0_18。

使用编程开发环境eclipse.exe编写。

本程序创建了两个类,两个类在同一个工程中。

其中Queen类的作用仅仅用来保存八皇后问题计算结果的数据,便于画图时使用。

本程序大概由两部分组成,第一部分是解八皇后问题,第二部分是画图。

程序源代码为:类1:public class Queen{public int[] x=new int[8];public int[] y=new int[8];public String name;}类2:import javax.swing.*;import java.awt.event.*;import java.awt.*;import javax.swing.JOptionPane;public class bahuanghou extends JFrame implements ActionListener {//JLabel[] l;int number=0; //当前显示的解的编号int sum=0; //所有解得数量JLabel l2;JButton b1,b2; //b1为显示下一组解得按钮,b2为显示上一组解得按钮。

Queen[] q=new Queen[128]; //得到的解储存在Queen类的数组里面。

private Image bomb1=Toolkit.getDefaultToolkit().getImage("D:\\qizi1.JPG"); //黑格棋子为bomb1private Image bomb2=Toolkit.getDefaultToolkit().getImage("D:\\qizi2.JPG"); //白格棋子为bomb2public bahuanghou() //构造方法,初始化窗口。

八皇后问题实验报告源程序

八皇后问题实验报告源程序

八皇后问题实验报告源程序八皇后问题实验报告需求分析八皇后问题是一个古老而著名的问题。

该问题是十九世纪著名的数学家高斯1850年提出的。

八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击.按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子,问有多少种不同的摆法?并找出所有的摆法。

因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。

而本课程设计本人的目的也是通过C语言平台将一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击的92种结构予以实现.最终将其问题变得一目了然,更加易懂。

概要分析本课件学生是用递归来实现的,分别一一测试了每一种摆法,并把它拥有的92种变化表现出来。

在这个程序中,学生的主要思路以及思想是这样的:1.解决冲突问题:这个问题包括了行,列,两条对角线;列:规定每一列放一个皇后,不会造成列上的冲突;行:当第i行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以i为下标的标记置为被占领状态;对角线:对角线有两个方向。

在这学生把这两条对角线称为:主对角线和从对角线。

在同一对角线上的所有点(设下标为(i,j)),要么(i+j)是常数,要么(i-j)是常数。

因此,当第i个皇后占领了第j列后,要同时把以(i+j)、(i-j)为下标的标记置为被占领状态。

(1) 满足上述条件的八个皇后,必然是每行一个,每列一个。

(2) 棋盘上任意一行、任意一列、任意一条斜线上都不能有两个皇后。

如果我们把8×8 的棋盘看成是一个平面直角坐标系,则八皇后问题就可以用数学语言来描述了,任意两个皇后在平面上的坐标应该同时满足以下三个条件:①两个皇后不在同一行:两个皇后的横坐标不相等;②两个皇后不在同一列:两个皇后的纵坐标不相等;③两个皇后不在同一条斜线上:两个皇后的横坐标之差的绝对值不等于两个皇后的纵坐标之差的绝对值。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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)
2.如果将92种情形全部打印,则前面的几十种情况将无法显示出,要想看到前面的状态,
第 8页
北京邮电大学信息与通信工程学院
必须添加一个控制语句,使其能一个一个的输出。 总结:这次实验让我更好地掌握了栈思想以及一维数组等等知识,以及一些书本上没有
的东西,让我学会了运用递归算法去解决一些复杂的问题 改进:不仅可以设计放置八皇后,也可以是9皇后,10皇后,只要修改N,目前程序无法
只显示 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)//计算出皇后的排列,knt i;
}
}
}
算法步骤:
(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)) //判断列,判断斜线
{
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) {
【实验内容】 利用栈结构实现八皇后问题。
八皇后问题 19 世纪著名的数学家高斯于 1850 年提出的。他的问题是:在 8*8 的棋盘上 放置 8 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线 上。请设计算法打印所有可能的摆放方法。
提示: 1、可以使用递归或非递归两种方法实现 2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上
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的循环嵌套未能很好掌握,导致几次调试都出现比较严 重的错误;且在运用该方法时,未能将八皇后问题的具体思路搞清,没有考虑“如果前次的 皇后放置错误导致后面的放置无论如何都不能满足要求,在设计递归算法总是只显示几种,
显示全部92种方法,可以加一些控制语句使它分页显示92种
第 9页
if(k>n)//如果达到里要求的数量输出皇后排列
{ Print(n);
count();
}
else //否则在适当的位置添加一个新皇后
{
for(i=1;i<=n;i++)
if(Check(i,k)) //判断该行中该位置放置'皇后'是否符合要求
{
q[k]=i;
//记录改行中该点的位置
Queens(k+1,n); //放置下一行的'皇后'
北京邮电大学信息与通信工程学院
数据结构实验报告
实验名称:实验二——栈和队列 学生姓名: 班 级: 班内序号: 学 号: 日 期:
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:
第 2页
北京邮电大学信息与通信工程学院
}
else //否则在适当的位置添加一个新皇后
{
for(i=1;i<=N;i++)
if(Check(i,k)) //判断该行中该位置放置'皇后'是否符合要

{
q[k]=i;
//记录改行中该点的位置
Queens(k+1); //放置下一行的'皇后'
}
}
}
void Queen::Print()
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();
相关文档
最新文档