北邮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为背包的承重量。
八皇后实验报告

八皇后实验报告八皇后实验报告引言:八皇后问题是一个经典的数学问题,它要求在一个8x8的国际象棋棋盘上放置8个皇后,使得任意两个皇后都不会互相攻击。
这个问题看似简单,但实际上却充满了挑战。
在本次实验中,我们将探索八皇后问题的解法,并通过编写算法来解决这个问题。
一、问题背景:八皇后问题最早由数学家马克斯·贝瑟尔于1848年提出,它是一道经典的递归问题。
在国际象棋中,皇后可以在同一行、同一列或同一对角线上进行攻击,因此我们需要找到一种方法,使得8个皇后彼此之间不会相互攻击。
二、解决方法:为了解决八皇后问题,我们可以使用回溯法。
回溯法是一种穷举搜索的方法,它通过逐步尝试所有可能的解决方案,直到找到符合要求的解。
具体步骤如下:1. 初始化一个8x8的棋盘,并将所有格子标记为无皇后。
2. 从第一行开始,依次尝试在每一列放置一个皇后。
3. 在每一列中,检查当前位置是否符合要求,即与已放置的皇后不在同一行、同一列或同一对角线上。
4. 如果当前位置符合要求,将皇后放置在该位置,并进入下一行。
5. 如果当前位置不符合要求,尝试在下一列放置皇后。
6. 重复步骤3-5,直到找到一个解或者所有可能的位置都已尝试过。
7. 如果找到一个解,将其输出;否则,回溯到上一行,继续尝试下一列的位置。
三、编写算法:基于上述步骤,我们可以编写一个递归函数来解决八皇后问题。
伪代码如下所示:```function solveQueens(board, row):if row == 8:print(board) # 打印解returnfor col in range(8):if isSafe(board, row, col):board[row][col] = 1solveQueens(board, row + 1)board[row][col] = 0function isSafe(board, row, col):for i in range(row):if board[i][col] == 1:return Falseif col - (row - i) >= 0 and board[i][col - (row - i)] == 1:return Falseif col + (row - i) < 8 and board[i][col + (row - i)] == 1:return Falsereturn Trueboard = [[0]*8 for _ in range(8)]solveQueens(board, 0)```四、实验结果:通过运行上述算法,我们得到了八皇后问题的所有解。
北邮数据结构实验报告

北邮数据结构实验报告摘要:本报告基于北邮数据结构实验,通过实际操作和实验结果的分析,总结和讨论了各实验的目的、实验过程、实验结果以及相关的问题和解决方法。
本报告旨在帮助读者了解数据结构实验的基本原理和应用,并为今后的学习和研究提供参考。
1. 实验一:线性表的操作1.1 实验目的本实验旨在掌握线性表的基本操作以及对应的算法实现,包括插入、删除、查找、修改等。
1.2 实验过程我们使用C++语言编写了线性表的相关算法,并在实际编程环境下进行了测试。
通过插入元素、删除元素、查找元素和修改元素的操作,验证了算法的正确性和效率。
1.3 实验结果经过测试,我们发现线性表的插入和删除操作的时间复杂度为O(n),查找操作的时间复杂度为O(n),修改操作的时间复杂度为O(1)。
这些结果与预期相符,并反映了线性表的基本特性。
1.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如插入操作的边界条件判断、删除操作时的内存释放等。
通过仔细分析问题,我们优化了算法的实现,并解决了这些问题。
2. 实验二:栈和队列的应用2.1 实验目的本实验旨在掌握栈和队列的基本原理、操作和应用,并进行实际编程实现。
2.2 实验过程我们使用C++语言编写了栈和队列的相关算法,并在实际编程环境下进行了测试。
通过栈的应用实现表达式求值和逆波兰表达式的计算,以及队列的应用实现图的广度优先遍历,验证了算法的正确性和效率。
2.3 实验结果经过测试,我们发现栈的应用可以实现表达式的求值和逆波兰表达式的计算,队列的应用可以实现图的广度优先遍历。
这些结果证明了栈和队列在实际应用中的重要性和有效性。
2.4 问题与解决方法在实验过程中,我们遇到了一些问题,例如中缀表达式转后缀表达式的算法设计、表达式求值的优化等。
通过查阅资料和与同学的讨论,我们解决了这些问题,并完善了算法的实现。
3. 实验三:串的模式匹配3.1 实验目的本实验旨在掌握串的基本操作和模式匹配算法,并进行实际编程实现。
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.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() //构造方法,初始化窗口。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构实验报告
实验名称:实验二——栈和队列 学生姓名: 班 级: 班内序号: 学 来自: 日 期:1.实验要求
【实验目的】 1、 进一步掌握指针、模板类、异常处理的使用 2、 掌握栈的操作的实现方法 3、 掌握队列的操作的实现方法 4、 学习使用栈解决实际问题的能力 5、 学习使用队列解决实际问题的能力
if(k>n)//如果达到里要求的数量输出皇后排列
{ Print(n);
count();
}
else //否则在适当的位置添加一个新皇后
{
for(i=1;i<=n;i++)
if(Check(i,k)) //判断该行中该位置放置'皇后'是否符合要求
{
q[k]=i;
//记录改行中该点的位置
Queens(k+1,n); //放置下一行的'皇后'
显示全部92种方法,可以加一些控制语句使它分页显示92种
第 9页
{
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) {
Queens(int k)函数:从第一个位置开始
第 4页
北京邮电大学信息与通信工程学院
2.1 存储结构
2.1 存储结构
1、
存储结构:栈(递归)
2.2 关键算法分析
1、递归
void Queen::Queens(int k,int n)//计算出皇后的排列,k 是当前皇后数量,n 是数量上
限
{ int i;
2. 程序分析 #include<iostream> #include<cmath> using namespace std; const int N=8; //皇后的个数
第 1页
北京邮电大学信息与通信工程学院
static int m=0;//用来计数,使用方法数 class Queen { public:
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();
return 0; //不符合返回 0 j++; } return 1; //符合返回 }
算法步骤:
1. 对于一个坐标,将前面每一个坐标均与这个坐标比较
2. 若在同一列或在同一斜线上,则返回 0,
3. 否则 j 自增 1,面每一个坐标与前面做比较
4. 若与前面坐标在同一列
5. 最后返回 1
2.3 其他 说明:由于输出显示时对话框有限,而程序结果比较多,占用空间大,最后
只显示 60 种到 92 种,可以运用输出坐标位置来表示,则可以输出全部解如:
void Queen::Print(int n) {
第 6页
北京邮电大学信息与通信工程学院
int i; for(i=1;i<=n;i++)
cout<<"("<<i<<","<<q[i]<<")"; cout<<endl; }
2.如果将92种情形全部打印,则前面的几十种情况将无法显示出,要想看到前面的状态,
第 8页
北京邮电大学信息与通信工程学院
必须添加一个控制语句,使其能一个一个的输出。 总结:这次实验让我更好地掌握了栈思想以及一维数组等等知识,以及一些书本上没有
的东西,让我学会了运用递归算法去解决一些复杂的问题 改进:不仅可以设计放置八皇后,也可以是9皇后,10皇后,只要修改N,目前程序无法
第 2页
北京邮电大学信息与通信工程学院
}
else //否则在适当的位置添加一个新皇后
{
for(i=1;i<=N;i++)
if(Check(i,k)) //判断该行中该位置放置'皇后'是否符合要
求
{
q[k]=i;
//记录改行中该点的位置
Queens(k+1); //放置下一行的'皇后'
}
}
}
void Queen::Print()
【实验内容】 利用栈结构实现八皇后问题。
八皇后问题 19 世纪著名的数学家高斯于 1850 年提出的。他的问题是:在 8*8 的棋盘上 放置 8 个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线 上。请设计算法打印所有可能的摆放方法。
提示: 1、可以使用递归或非递归两种方法实现 2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上
}
}
}
算法步骤:
(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)) //判断列,判断斜线
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)
3. 程序运行结果 1 实验流程图
开始 输入 n
判断是否满行
判断位置(i,k) 是否符合要求 Y q[k]=i k++
Y 输出结果
N
N i++
2 测试条件:无特殊测试条件 3.实验结果:
第 7页
北京邮电大学信息与通信工程学院
4. 总结
调试时出现的问题:1. for与if的循环嵌套未能很好掌握,导致几次调试都出现比较严 重的错误;且在运用该方法时,未能将八皇后问题的具体思路搞清,没有考虑“如果前次的 皇后放置错误导致后面的放置无论如何都不能满足要求,在设计递归算法总是只显示几种,