当前位置:文档之家› n皇后问题实验报告

n皇后问题实验报告

n皇后问题实验报告
n皇后问题实验报告

N后问题算法

一、实验目的及要求

所要涉及或掌握的知识:

1. 了解皇后相互攻击的条件:如果任意两个皇后在同一行,同一列或同一对角线,则她们相互攻击。

2. 运用迭代的方法实现6皇后问题,求解得到皇后不相互攻击的一个解

3. 在运用迭代的方法实现编程时,要注意回溯点

二、问题描述及实验内容

对6皇后问题求解,用数组c[1…6]来存皇后的位置。c[i]=j表示第i个皇后放在第j列。

最后程序运行的结果是c[1…6]={1,5,8,6,3,7 }

三、问题分析和算法描述

6-QUEENS的算法表示:

输入:空。

输出:对应于6皇后问题的解的向量c[1…6]={1,5,8,6,3,7}

1. for k=1 to 6

2. c[k]=0 //没有放皇后

3. end for

4. flag=false

5. k=1

6. while k>=1

7.while c[k]<=5

8.c[k]=c[k]+1

9.if c为合法着色 then set flag=ture 且从两个while循环退出

10.else if c是部分解 then k=k+1

11.end while

12. c[k]=0 //回溯并c[k]=0

13. k=k-1

14. end while

15. if flag then output c

16. else output “no solution”

四、具体实现

# include

#include

#include

#include

#include "iostream"

using namespace std;

int total = 0; //方案计数

void backtrace(int queen[],int N)

{

int i, j, k;

cout<<"★为皇后放置位置\n";

for (i=1;;)

{ //首先安放第1行

if(queen[i]

{ //皇后还可调整

k=0; //检查与第k个皇后是否互相攻击

while(k

{ //与第k个皇后互相攻击

queen[i]++; //第i个皇后右移一列,重测

continue;

}

i++; //无冲突,安置下一行皇后

if(i

cout<<"第"<

for(int i=0;i

{

for(int j=0;j

cout<<"□";

cout<<"★";

for(int k=queen[i]+1;k

cout<<"□";

cout<

}

total++; //方案数加1

if(total%5==0) cout<

queen[N-1]++; // 将第8个皇后右移一列,前8个不动

i=N-1; //此处是制造机会,如不成功则回溯,关键一步

}

else //当前行皇后无法安置,回溯

{

queen[i]=0; //当前行皇后回归1列

i--; //回溯到前一行皇后

if(i<0)

{ //回溯到数组1行之前,结束

cout<<"\n针对 "<

cout<

return;

}

else queen[i]++; //前一行皇后右移一列

}

}

}

void main()

{

while(1)

{

clock_t start, finish;

double duration;

int N;

cout<<"请输入皇后个数:"<

cin>>N;

int* queen=new int[N];

for (int i=0;i

int n=N; /* 定义数组p[N]用来存放结果序列,n为行号 */

start=clock();

total=0;

backtrace(queen,N);

finish=clock();

duration=(double)(finish-start);

cout<<"为找出放置方法系统共耗时 "<

}

}

运行结果:

回溯法求解八皇后问题

2010-10-29 18:28:56| 分类:算法分析 | 标签:皇后回溯数组位置八皇后问题|举报|字号订阅

问题描述:八皇后问题是一个以国际象棋为背景的问题:如何能够在8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。

问题历史:八皇后问题最早是由国际象棋棋手马克斯·贝瑟尔于1848年提出。之后陆续有数学家对其进行研究,其中包括高斯和康托,并且将其推广为更一般的n皇后摆放问题。八皇后问题的第一个解是在1850年由弗朗兹·诺克给出的。诺克也是首先将问题推广到更一般的n皇后摆放问题的人之一。1874年,S.冈德尔提出了一个通过行列式来求解的方法,这个方法后来又被J.W.L.格莱舍加以改进。

转化规则:其实八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当n = 1 或n ≥ 4 时问题有解。令一个一位数组a[n]保存所得解,其中a[i] 表示把第i个皇后放在第i行的列数(注意i的值都是从0开始计算的),下面就八皇后问题做一个简单的从规则到问题提取过程。

(1)因为所有的皇后都不能放在同一列,因此数组的不能存在相同的两个值。(2)所有的皇后都不能在对角线上,那么该如何检测两个皇后是否在同一个对角线上?我们将棋盘的方格成一个二维数组,如下:

假设有两个皇后被放置在(i,j)和(k,l)的位置上,明显,当且仅当

|i-k|=|j-l|时,两个皇后才在同一条对角线上。

算法原型:上面我们搞清楚了在解决八皇后问题之前需要处理的两个规则,并将规则转化到了我们数学模型上的问题,那么这段我们开始着手讨论如何设计

明显,回溯的思想是:假设某一行为当前状态,不断检查该行所有的位置是否能放一个皇后,检索的状态有两种:

(1)先从首位开始检查,如果不能放置,接着检查该行第二个位置,依次检查下去,直到在该行找到一个可以放置一个皇后的地方,然后保存当前状态,转到下一行重复上述方法的检索。

(2)如果检查了该行所有的位置均不能放置一个皇后,说明上一行皇后放置的位置无法让所有的皇后找到自己合适的位置,因此就要回溯到上一行,重新检

查该皇后位置后面的位置。

是否注意到?如果我们用一个数组来保存当前的状态,上面的检索过程是否有点像堆栈的操作?如果找到可行位置,压栈,如果当前行所有位置不行,将出栈。好了,问题模型逐渐清晰开来了,我们可以定义一个过程,这个过程负责检索的过程,如果检索到当前行某个位置可行,压栈,如果当前行所有位置不行,将执行出栈操作。8皇后问题,我们假定栈的大小为8,如果栈满了,表示找到了可行方法,将执行所有出栈操作。也许有同学会问:如果我找到了一个方法,在进入找下一个可行方法时,该如何做到找出的方法不重复?我们是否需要为每行设定一个状态变量?其实这个问题的处理方法很简单:其实我们在回溯的时候,每个皇后所在位置就是该行的状态变量,回溯转到下一个位置的时候,只需后移1位即可,也就是i++。

OK,其实我们可以使用一个数组来模拟栈的结构就可以了,上面解说的时候不用数组而使用栈是因为栈的结构比数组更形象而已。根据上述想法,我们必须定义一个过程,这个过程用来检查当前行的某个位置是否可行,为了方便大家阅读,我采用了常用的算法描述语言SPARKS 。SPARKS 有个最大的特点就是非常注重算法的思想而不是代码,这样可以更加清晰明了地帮助读者了解作者的算法思想。

(2)利用上述的检索过程,通过递归的方式,来确定每个皇后的位置———回

八年级下册物理实验报告单(供参考)

年级:八年级姓名:日期:3月6日 实验名称:用弹簧测力计测量力的大小 一、实验目的 1.练习使用弹簧测力计。 2.正确使用弹簧测力计测量力的大小。 二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计2个(规格相同),钩码2个,铁架台。 三、实验步骤或内容: 1.检查实验器材。 2.测量手的拉力。 3.测量钩码所受的重力。 4.测两个弹簧测力计相互作用的拉力。 5.整理器材。 五、实验记录与结论 1.弹簧测力计的量程 0-5N ,分度值 0.2N ,指针是否指零刻线是。 2.记录数据:

年级:八年级姓名:日期: 实验名称:探究重力的大小与质量的关系。 一、实验目的 探究重力的大小与质量的关系。 二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计,铁架台,相同的钩码5个(质量已知),铅笔, 刻度尺。 三、实验步骤或内容:要求步骤或内容简单明了 (1)检查器材:观察弹簧测力计的量程、分度值,指针是否指到 零刻度线。 (2)将弹簧测力计悬挂在支架上。 (3)将钩码逐个加挂在弹簧测力计上。 (4)将5次的测量结果记录在表格中。 (5)整理器材。 四、实验记录与结论 1.观察弹簧测力计的量程为 0-5N N,分度值为 0.2 N。 实验结论: 重力的大小跟物体的质量的关系是物体所受重力与物体质量成 正比。

年级:八年级姓名:日期: 实验名称:探究影响滑动摩擦力大小的因素 一、实验目的 探究压力的大小和接触面的粗糙程度对滑动摩擦力大小的影响。 二、实验仪器和器材(要求标明各仪器的规格型号) 木块,砝码,弹簧测力计,毛巾。 三、实验步骤或内容:要求步骤或内容简单明了 (1)检查器材:观察弹簧测力计的量程和分度值,指针是否指在零刻线处。(2)当木块在水平桌面上运动,测出压力F=G木块时木块受到的滑动摩擦力。(3)改变压力,将砝码放在木块上,测出木块压力F>G木块时木块受到的滑动摩擦力。 (4)改变接触面的粗糙程度,将毛巾平铺在水平桌面上,测出压力F=G木块时木块受到的滑动摩擦力。 (5)整理器材。 五、实验记录与结论 (1)弹簧测力计的量程为0-5N,分度值为0.2N。 (3)实验结论: 在接触面相同时,压力越大,滑动摩擦力越大;在压力相等的情况下,接触表面越粗糙,滑动摩擦力越大。

n后问题实验报告

一.实验目的 1. 了解皇后相互攻击的条件:如果任意两个皇后在同一行,同一列或同一对角线,则她们相互攻击。 2. 运用迭代的方法实现n皇后问题,求解得到皇后不相互攻击的一个解 二.实验内容 基本思路:用n元组x[1:n]表示n后问题的解,其中x[i]表示第i个皇后放在棋盘的第i行的第x[i]列。抽象约束条件得到能放置一个皇后的约束条件:(1)x[i]!=x[k]; (2)abs(x[i]-x[k])!=abs(i-k)。应用回溯法,当可以放置皇后时就继续到下一行,不行的话就返回到第一行,重新检验要放的列数,如此反复,直到将所有解解出。在回溯法中,递归函数Backtrack(1)实现对整个解空间的回溯搜索。Backtrack(i)搜索解空间的第i层子树。类Queen的数据成员记录解空间的节点信息,以减少传给Backtrack函数的参数。sum记录当前已找到的可行方案数。 运用回溯法解题通常包含以下三个步骤: (1)针对所给问题,定义问题的解空间; (2)确定易于搜索的解空间结构; (3)以深度优先的方式搜索解空间,并且在搜索过程中用剪枝函数避免无效搜索。 源代码: #include using namespace std; class Queen{ friend int nQueen(int); private: bool Place(int k); void Backtract(int t); int n,*x; long sum; //可行方案数 }; bool Queen::Place(int k) { for(int j=1;j

八年级(下)物理实验报告单

一练习使用弹簧测力计 班级姓名 实验目的:会正确使用弹簧测力计 实验器材:弹簧测力计一个,其余学生自备。 1.观察:弹簧测力计的量程是,分度值是。 2.检查:指针是否指在零刻度线上?指针是否与平板之间有摩擦? 3.感受: 用手拉测力计,使指针分别指在1N、3N、5N,感受一下1N、3N、5N的力的大小。 4.测量: (1)把笔袋挂在挂钩上,提起笔袋,笔袋对测力计的拉力,F= (2)把笔袋挂在挂钩上,在桌面上水平拖动笔袋,笔袋对测力计的拉力,F= (3)拉断一根头发,所需要的力,F= 5.使用弹簧测力计时: (1)如果所测量的力的大小超出测力计的量程,会 (2)如果没有认清分度值,会 (3)如果指针指在零刻度线的上方或下方就进行测量,会使测量值或

二探究重力的大小跟质量的关系 班级姓名 实验目的:正确使用弹簧测力计,正确记录实验数据,正确绘制数据图像,根据实验数据和图像总结出重力的大小跟质量的关系 实验器材:弹簧测力计一个,勾码一盒。 1.看勾码盒上的标注,每个勾码的质量是kg。 2.逐次增挂钩码个数,测出所受重力,并记录在下面的表格中。 3.在右图中,以质量为横坐标,重力为纵坐标, 描点并画出重力与质量的关系图像。 4.分析数据和图像,重力与质量的关系是 重力与质量的比值是(用g表示)。重力与质量的关系式用字母表示为: 5. 重力与质量的比值g=9.8N/kg,表示的物理意义是

三探究二力平衡的条件 班级姓名 实验目的:通过探究,知道作用在一个物体上的两个力满足什么条件时,才能平衡。 实验器材:长木板(两端有滑轮)一个,小车一个(两端有挂钩),钩码一盒,细绳两段。 1.小车保持平衡状态,是指小车处于状态或状态。 2.按右图所示装好器材 3. 两端挂上数量不相等的钩码,观察小车的运动状态。 4. 两端挂上数量相等的钩码,观察小车的运动状态。 5. 两端挂上数量相等的钩码,把小车在水平桌面上扭转一个角度后再放手,观察小车的运动状态。 把实验条件和观察到现象记录在下面的表格中 6.总结二力平衡的条件: 作用在同一个物体上的两个力,如果大小,方向,并且 ,这两个力就彼此平衡。这时物体就处于状态或状态。

算法实验 递归回溯解八皇后问题

深圳大学实验报告 课程名称:算法分析与复杂性理论 实验项目名称:八皇后问题 学院:计算机与软件学院 专业:软件工程 指导教师:杨烜 报告人:学号:班级:15级软工学术型实验时间:2015-12-08 实验报告提交时间:2015-12-09 教务部制

一.实验目的 1.掌握选回溯法设计思想。 2.掌握八皇后问题的回溯法解法。 二.实验步骤与结果 实验总体思路: 根据实验要求,通过switch选择八皇后求解模块以及测试数据模块操作,其中八皇后模块调用摆放皇后函数模块,摆放皇后模块中调用判断模块。测试数据模块主要调用判断模块进行判断,完成测试。用一维数组保存每行摆放皇后的位置,根据回溯法的思想递归讨论该行的列位置上能否放置皇后,由判断函数Judge()判断,若不能放置则检查该行下一个位置。相应结果和过程如下所示(代码和结果如下图所示)。 回溯法的实现及实验结果: 1、判断函数 代码1: procedure BTrack_Queen(n) //如果一个皇后能放在第K行和X(k)列,则返回true,否则返回false。 global X(1:k);integer i,k i←1 while i0 do X(k)←X(k)+1 //移到下一个位置 while X(k)<=n and not Judge(k) do //判断能否放置皇后 X(k)←X(k)+1 repeat if X(k)<=n //找到一个位置 then if k=n //是一个完整的解吗

n皇后问题算法实验报告

算法分析与设计实验报告 实验内容:N皇后问题 实验时间:2013.12.3 姓名:杜茂鹏 班级:计科1101 学号:0909101605

一、实验内容及要求 在n×n格的棋盘上放置彼此不受攻击的n个皇后,按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 二、实验目的 1.巩固和加深对回溯法的理解 2.了解递归和迭代法在回溯法中的应用 三、算法分析 1.理解皇后不被攻击的条件:n后问题等价于在n*n格的棋盘上放置n个皇后,任何两个皇后不能放在同一行或同一列或同一斜线上。 2.算法模块简要分析 用数组存储皇后的位置,将i设置为0. Int place(*x,n) :数组x[] 用来表示列数,n为皇后个数,用来判断皇后是否被攻击,判断的条件是(x[i]-x[n]==i-n||x[i]-x[n]==n-i||x[i]==x[n])即用来判断“同一行或同一列或同一斜线上”。 Int print(*x,n):打印皇后解的空间。 Int iniprint(*x,n):初始化打印函数,相当于对棋盘初始化。将可以放皇后的位置记为“1”,不放皇后的位置记为“0”。 Int Nqueen(int n):n皇后问题求解,如果满足一组可行解,sum++。Int i=0,如果x[i]>=n的时候即进行下一行,i++;当i=n时,

sum++;输出该组可行解的个数和位置的矩阵。并且i--,回溯到上一层继续搜索可行解。 四、运行结果及分析 1、三皇后没有可行解 2、 2.4个皇后有2个可行解 3.5皇后有10个可行解 五、源代码 #include static int n, sum=0;//可行解个数 static int locate[20]; int place(int k) {//判断是否在一条线上并返回0,1 for(int i=1;in){

回溯法实验(n皇后问题)

算法分析与设计实验报告第六次实验

附录: 完整代码(回溯法) //回溯算法递归回溯n皇后问题#include #include #include #include"math.h" using namespace std; class Queen

{ friend int nQueen(int); //定义友元函数,可以访问私有数据 private: bool Place(int k); //判断该位置是否可用的函数 void Backtrack(int t); //定义回溯函数 int n; //皇后个数 int *x; //当前解 long sum; //当前已找到的可行方案数 }; int main() { int m,n; for(int i=1;i<=1;i++) { cout<<"请输入皇后的个数:"; //输入皇后个数 cin>>n; cout<<"皇后问题的解为:"<

数据结构实验报告利用栈结构实现八皇后问题

数据结构实验报告 实验名称:实验二——利用栈结构实现八皇后问题 学生姓名: 班级: 班内序号: 学号: 日期:2013年11月21日 1.实验要求 (1)实验目的 通过选择下面五个题目之一进行实现,掌握如下内容: 进一步掌握指针、模板类、异常处理的使用 掌握栈的操作的实现方法 掌握队列的操作的实现方法 学习使用栈解决实际问题的能力 学习使用队列解决实际问题的能力 (2)实验内容 利用栈结构实现八皇后问题。 八皇后问题19世纪著名的数学家高斯于1850年提出的。他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。请设计算法打印所有可能的摆放方法。 ①可以使用递归或非递归两种方法实现 ②实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线。 (3)代码要求 ①必须要有异常处理,比如删除空链表时需要抛出异常; ②保持良好的编程的风格: 代码段与段之间要有空行和缩近 标识符名称应该与其代表的意义一致 函数名之前应该添加注释说明该函数的功能 关键代码应说明其功能 ③递归程序注意调用的过程,防止栈溢出 2. 程序分析 2.1 存储结构 栈(递归):

2.2 关键算法分析 (1)递归 void SeqStack::PlaceQueen(int row) //在栈顶放置符合条件的值的操作,即摆放皇后{ for (int col=0;col::Judgement() { for(int i=0;i

数据结构实验报告——栈(八皇后问题)

1.实验要求 【实验目的】 1、进一步掌握指针、模板类、异常处理的使用 2、掌握栈的操作的实现方法 3、掌握队列的操作的实现方法 4、学习使用栈解决实际问题的能力 5、学习使用队列解决实际问题的能力 【实验内容】 利用栈结构实现八皇后问题。 八皇后问题19世纪著名的数学家高斯于1850年提出的。他的问题是:在8*8的棋盘上放置8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列、同一斜线上。请设计算法打印所有可能的摆放方法。 提示: 1、可以使用递归或非递归两种方法实现 2、实现一个关键算法:判断任意两个皇后是否在同一行、同一列和同一斜线上2. 程序分析 2.1 存储结构 存储结构:栈(递归) 2.2 关键算法分析 【设计思想】 由于八皇后问题,可以分解成算法相同的子问题,所以使用递归的方法 【伪代码】 1、输入皇后个数n 2、k=1 3、判断k是否大于n 3.1 是:打印一组可能 3.2 否:循环行位置1~n 判断该位置是否符合要求,若符合记录q[k]的坐标y值 k+1 重复3 【关键算法】 1、递归 void Queen::Queens(int k,int n)

{ int i; if(k>n) { Print(n); count(); } else { for(i=1;i<=n;i++) if(Isavailable(i,k)) //判断该行中该位置放置‘皇后’是否符合要求 { q[k]=i; //记录改行中该点的位置 Queens(k+1,n); //放置下一行的‘皇后’ } } } 2、判断皇后放置位置是否符合要求 bool Queen::Isavailable(int i,int k) { int j; j=1; while(j

八皇后问题的解决完整文档

工学院 数据结构课程设计报告设计题目:八皇后 2008 年 6 月25 日 设计任务书

摘要: 八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击.按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子.因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。 而本课程设计本人的目的也是通过用c++语言平台将一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击的92种结构予以实现.使用递归方法最终将其问题变得一目了然,更加易懂。 关键词:八皇后; c++; 递归法

目录 1. 课题综述 (1) 1.1课题的来源及意义 (1) 1.2面对的问题 (1) 2. 需求分析 (1) 2.1涉及到的知识 (2) 2.2软硬件的需求 (2) 2.3功能需求 (2) 3. 概要设计 (2) 4. 详细设计和实现 (3) 4.1算法描述及详细流程图 (3) 4.1.1算法描述 (3) 4.1.2算法流程图 (3) 5. 代码编写及详细注释 (4) 6. 程序调试 (8) 6.1调试过程、步骤及遇到的问题 (8) 7. 运行与测试 (8) 7.1运行演示 (8) 总结 (10) 致 (11)

参考文献 (12) .

1. 课题综述 1. 1课题的来源及意义 八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。 在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。 到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。 1. 2 面对的问题 1)解决冲突问题: 这个问题包括了行,列,两条对角线; 列:规定每一列放一个皇后,不会造成列上的冲突; 行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态; 2)使用数据结构的知识,用递归法解决问题。 2. 需求分析

八年级下册物理实验报告单(供参考)

初中物理实验报告单 年级:八年级姓名:日期:3月6日 实验名称:用弹簧测力计测量力的大小 一、实验目的 1.练习使用弹簧测力计。 2.正确使用弹簧测力计测量力的大小。 二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计2个(规格相同),钩码2个,铁架台。 三、实验步骤或内容: 1.检查实验器材。 2.测量手的拉力。 3.测量钩码所受的重力。 4.测两个弹簧测力计相互作用的拉力。 5.整理器材。 五、实验记录与结论 1.弹簧测力计的量程 0-5N ,分度值 0.2N ,指针是否指零刻线是。 2.记录数据: 初中物理实验报告单 年级:八年级姓名:日期: 实验名称:探究重力的大小与质量的关系。 一、实验目的 探究重力的大小与质量的关系。

二、实验仪器和器材(要求标明各仪器的规格型号) 弹簧测力计,铁架台,相同的钩码5个(质量已知),铅笔, 刻度尺。 三、实验步骤或内容:要求步骤或内容简单明了 (1)检查器材:观察弹簧测力计的量程、分度值,指针是否指到 零刻度线。 (2)将弹簧测力计悬挂在支架上。 (3)将钩码逐个加挂在弹簧测力计上。 (4)将5次的测量结果记录在表格中。 (5)整理器材。 四、实验记录与结论 1.观察弹簧测力计的量程为 0-5N N,分度值为 0.2 实验结论: 重力的大小跟物体的质量的关系是物体所受重力与物体质量成 正比。 初中物理实验报告单 年级:八年级姓名:日期: 实验名称:探究影响滑动摩擦力大小的因素 一、实验目的 探究压力的大小和接触面的粗糙程度对滑动摩擦力大小的影响。 二、实验仪器和器材(要求标明各仪器的规格型号) 木块,砝码,弹簧测力计,毛巾。

n皇后问题实验报告

N后问题算法 一、实验目的及要求 所要涉及或掌握的知识: 1. 了解皇后相互攻击的条件:如果任意两个皇后在同一行,同一列或同一对角线,则她们相互攻击。 2. 运用迭代的方法实现6皇后问题,求解得到皇后不相互攻击的一个解 3. 在运用迭代的方法实现编程时,要注意回溯点 二、问题描述及实验内容 对6皇后问题求解,用数组c[1…6]来存皇后的位置。c[i]=j表示第i个皇后放在第j列。 最后程序运行的结果是c[1…6]={1,5,8,6,3,7 } 三、问题分析和算法描述 6-QUEENS的算法表示: 输入:空。 输出:对应于6皇后问题的解的向量c[1…6]={1,5,8,6,3,7} 1. for k=1 to 6 2. c[k]=0 //没有放皇后 3. end for 4. flag=false 5. k=1 6. while k>=1 7.while c[k]<=5 8.c[k]=c[k]+1

9.if c为合法着色 then set flag=ture 且从两个while循环退出 10.else if c是部分解 then k=k+1 11.end while 12. c[k]=0 //回溯并c[k]=0 13. k=k-1 14. end while 15. if flag then output c 16. else output “no solution” 四、具体实现 # include #include #include #include #include "iostream" using namespace std; int total = 0; //方案计数 void backtrace(int queen[],int N) { int i, j, k; cout<<"★为皇后放置位置\n"; for (i=1;;) { //首先安放第1行 if(queen[i]

八皇后实验报告

实验项目: 八皇后问题 1.实验目的: 通过求解皇后问题,熟悉深度优先搜索法DFS(回溯法(Backtracking Algorithms)技术。 2.实验内容: 由n2 个方块排成n行n列的正方形称为n元棋盘。如果两个皇后位于n元棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。现要找出使棋盘上n个皇后互不攻击的布局。编制程序解决上述问题,以n=6运行程序,输出结果。 3.程序简介: 将n个皇后放到一个n*n的方阵中,要求每个皇后不在同一行同一列及同一对角线,我的程序是先把每个皇后放在了第零列,然后再按行检查,不符合要求继续下一列,若已经到这一行的最后一列,还没找到符合要求的位置,则回到上一行。 4.算法设计介绍: 定义一个一维数组,数组的下标是皇后所在位置的行数,数组存的值是皇后所在位置的列数,现将A[0]-A[n-1]都赋成零,然后随着检查的进行,皇后的位置也在不断地变化,最后找到一个符合要求的方阵时,本质上就是一个存放整数的一维数组,数组的下标是行数,存放的值是列数。 5.困难及解答 我很久以前就听说过八皇后问题,没想到现在轮到自己编了,一开始还真是特别糊涂呢,后来老师上课把算法大概讲了一遍,就清楚很多了,要说问题,就是一开始纠结怎么存放皇后,我开始想用二维数组着,后来老师说用一

维数组比较好做,我看了一下老师的算法,就明白了大概,经过一段时间就编出来了 5.心得 我编程变得还是很少,天天下决心说以后多编,也没践行,心想着吧,不挂在嘴上了,努力! 6.程序清单 /* //我真诚地保证: //我独立完成了整个程序从分析、设计到编码的所有工作。 //如果在上述过程中,我遇到了什么困难而求教于人,那么,我将在程序实习报告中 //详细地列举我所遇到的问题,以及别人给我的提示。 //我的程序里中凡是引用到其他程序或文档之处, //例如教材、课堂笔记、网上的源代码以及其他参考书上的代码段, //我都已经在程序的注释里很清楚地注明了引用的出处。 //我从未没抄袭过别人的程序,也没有盗用别人的程序,//不管是修改式的抄袭还是原封不动的抄袭。//我编写这个程序,从来没有想过要去破坏或妨碍其他计算机系统的正常运转 文件名称: 创建者: 创建时间: 2011.4.14

8皇后问题matlab算法

M文件 function PlaceQueen(row,matrix,N)%回溯法放置皇后 if row>N PrintQueen(N,matrix);%打印棋盘 else for col=1:N matrix(row,col)=1; if row==1||Conflict(row,col,N,matrix)%检测是否冲突 PlaceQueen(row+1,matrix,N); end matrix(row,col)=0; end end %子函数:检测冲突 function result=Conflict(row,col,N,matrix)%检测是否冲突 result=1; for i=1:row-1 for j=1:N if matrix(i,j)==1 if ((j==col)||(abs(row-i)==abs(col-j)))%是否产生冲突:在同一直线,斜线上 result=0; break; end end end if result==0 break; end end %子函数:打印棋盘信息

function PrintQueen(N,matrix) global solutionNum; %定义全局变量,来累积方法数 solutionNum=solutionNum+1; disp(['第',num2str(solutionNum),'种方法:']) disp(matrix) 脚本文件 clear all clc global solutionNum; solutionNum=0;%全局变量记录方法数 N=8;%皇后个数 matrix=zeros(N);%存储皇后位置信息 PlaceQueen(1,matrix,N)%调用放置方法

八皇后问题讲解

计算机科学与技术专业 数据结构课程设计报告设计题目:八皇后问题

目录 1需求分析 (3) 1.1功能分析 (3) 1.2设计平台 (4) 2概要设计 (4) 2.1算法描述 (5) 2.2算法思想 (6) 2.3数据类型的定义 (6) 3详细设计和实现 (7) 3.1算法流程图 (7) 3.2 主程序 (7) 3.3 回溯算法程序 (8) 4调试与操作说明 (10) 4.1调试情况 (10) 4.2操作说明 (10) 5设计总结 (12) 参考文献 (13) 附录 (13)

1需求分析 1.1功能分析 八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的,并作了部分解答。高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有76种不同的放法,这就是有名的“八皇后”问题。 在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。现在我们已经知道八皇后问题有92个解答。 1、本演示程序中,利用选择进行。程序运行后,首先要求用户选择模式,然后进入模式。皇后个数设0

n皇后问题实验报告

算 法 分 析 与 设 计 报 告 N皇后问题 N后问题算法 一、实验目的及要求 所要涉及或掌握的知识: 1. 了解皇后相互攻击的条件:如果任意两个皇后在同一行,同一列或同一对角线,则她们相互攻击。

2. 运用迭代的方法实现6皇后问题,求解得到皇后不相互攻击的一个解 3. 在运用迭代的方法实现编程时,要注意回溯点 二、问题描述及实验内容 对6皇后问题求解,用数组c[1…6]来存皇后的位置。c[i]=j表示第i个皇后放在第j列。 最后程序运行的结果是c[1…6]={1,5,8,6,3,7 } 三、问题分析和算法描述 6-QUEENS的算法表示: 输入:空。 输出:对应于6皇后问题的解的向量c[1…6]={1,5,8,6,3,7} 1. for k=1 to 6 2. c[k]=0 //没有放皇后 3. end for 4. flag=false 5. k=1 6. while k>=1 7. while c[k]<=5 8. c[k]=c[k]+1 9. if c为合法着色 then set flag=ture 且从两个while循环退出 10. else if c是部分解 then k=k+1 11. end while 12. c[k]=0 //回溯并c[k]=0 13. k=k-1 14. end while

15. if flag then output c 16. else output “no solution” 四、具体实现 # include #include #include #include #include "iostream" using namespace std; int total = 0; //方案计数 void backtrace(int queen[],int N) { int i, j, k; cout<<"★为皇后放置位置\n"; for (i=1;;) { //首先安放第1行 if(queen[i]

2014-2015八年级(下)物理实验报告单

庆坪中学探究实验报告单 八年级物理(下) 一练习使用弹簧测力计 班级姓名 实验目的:会正确使用弹簧测力计 实验器材:弹簧测力计一个,其余学生自备。 1.观察:弹簧测力计的量程是5N ,分度值是0.2N 。 2.检查:指针是否指在零刻度线上?指针是否与平板之间有摩擦? 3.感受: 用手拉测力计,使指针分别指在1N、3N、5N,感受一下1N、3N、5N的力的大小。 4.测量: (1)把笔袋挂在挂钩上,提起笔袋,笔袋对测力计的拉力,F= 4N (2)把笔袋挂在挂钩上,在桌面上水平拖动笔袋,笔袋对测力计的拉力,F=1.5N (3)拉断一根头发,所需要的力,F= 5.使用弹簧测力计时: (1)如果所测量的力的大小超出测力计的量程,会损坏弹簧秤 (2)如果没有认清分度值,会出现读数错误 (3)如果指针指在零刻度线的上方或下方就进行测量,会使测量值偏大或偏小

庆坪中学探究实验报告单 八年级物理(下) 二探究重力的大小跟质量的关系 班级姓名 实验目的:正确使用弹簧测力计,正确记录实验数据,正确绘制数据图像,根据实验数据和图像总结出重力的大小跟质量的关系 实验器材:弹簧测力计一个,勾码一盒。 1.看勾码盒上的标注,每个勾码的质量是0.05 kg。 2.逐次增挂钩码个数,测出所受重力,并记录在下面的表格中。 实验次数一个钩 码两个钩 码 三个钩 码 四个钩 码 五个钩 码 六个 钩码 质量m/kg 0.05 0.10 0.15 0.20 0.25 0.30 重力G/N 0.49 0.98 1.47 1.98 2.45 2.94 重力与质量之比9.8 9.8 9.8 9.8 9.8 9.8 3.在右图中,以质量为横坐标,重力为纵坐标, 描点并画出重力与质量的关系图像。 4.分析数据和图像,重力与质量的关系是 成正比关系 重力与质量的比值是9.8 (用g表示)。 重力与质量的关系式用字母表示为:G =mg 5. 重力与质量的比值g=9.8N/kg,表示的物

算法设计与分析实验报告—八皇后问题

算法设计与分析 实验报告 —八皇后问题 - 姓名:崔明鑫 学号:08208012 班级:软件83

【问题描述】 在国际象棋盘上放八个皇后,要求任一皇后吃不到别人,也不受其他皇后的攻击,求出问题的所有解。 【问题分析&算法设计】 用8元组x[1: n]表示8后问题。其中x[ i]表示皇后i放在棋盘的第i行的第x[ i]列。由于不允许将2个皇后放在一列,所以解向量中的x[ i]互不相同。2个皇后不能放在同一斜线上是问题的隐约束。故若2个皇后放置的位置分别是(i,j)和(k,l),且i – j = k – l或i + j = k + l,则说明这2个皇后处于同一斜线上。这两个方程分别等价于i – k = j – l和i – k = l – j。由此可知,只要|i - k| = |j - l|成立,就表明2个皇后位于同一条斜线上。问题的隐约束化成了显约束。用回溯法解决8皇后问题时,用完全8叉树表示解空间。 【算法实现】 #include "stdio.h" #include "math.h" #include "iostream.h" #define N 8 /* 定义棋盘大小*/ static int sum; /* 当前已找到解的个数*/ static int x[N]; /* 记录皇后的位置,x[i]表示皇后i放在棋盘的第i行的第x[i]列*/ /* 每找到一个解,打印当前棋盘状态*/ void Show() { sum++; cout << "第" << sum << "种情况:" << endl; cout << "坐标为:\t"; for(int k = 0; k < N; k++)

八皇后问题 C语言程序设计

八皇后问题学 2012年 9 月 5 日 目录 一、选题 1.1背景知识 (2) 1.2设计目的与要求 (2) 二、算法设计 2.1问题分析 (3) 2.2算法设计 (3) 三、详细设计 3.1源程序清单 (4) 四、调试结果及分析 4.1调试结果 (6) 4.2调试分析 (7) 五、课程设计总结 5.1总结及体会 (7) 六、答辩 6.1答辩记录 (8) 6.2教师意见 (8) 一、选题及背景知识 1.1 背景知识

在国际象棋中,皇后是一个威力很大的棋子,她可以“横冲直撞”(在正负或垂直方向走任意步数),也可以“斜刺冲杀”(在正负45度方向走任意步数),所以在8*8的棋盘上要布互相不受攻击的皇后,最多只能布八个,共92种布法,再也不能有别的布法了——这就是著名的八皇后问题 在8*8的国际象棋棋盘上,放置八个皇后,使得这八个棋子不能互相被对方吃掉。也就是说一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子.因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。 1.2 设计要求 要求:·判断在国际象棋中,能否在空棋盘上摆放8个皇后,并使其中任意两个皇后不能在同一行,同一列或同一对角线上。 ·编写完整的摆放八皇后问题的程序 ·具体要求第一个皇后的起始位置由键盘输入 二、算法设计 2.1问题分析 设计——图形表示下图中,Q代表皇后 假设在第k列上找到合适的位置放置一个皇后,要求它与第1——k-1列上的皇后不同行、列、对角线;可以从图上找到规律:不同列时成立,皇后放在第k列上;讨论行时,第j个皇后的位置(a[j] ,j)要与(i,k)位置的皇后不同行;如果同在/斜线上,行列值之和相同;如果同在\斜线上,行列值之差相同;如果斜线不分方向则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同,可表示为(|a[j]-i|=|j-k|)。 2.2 算法设计 利用计算机运行速度快的特点,采用枚举法,逐一尝试各种摆放方式,来判断最终摆法。其中判断是否同在对角线上用到了:行数差的绝对值与列数差的绝对值相等,

回溯法实验(n皇后问题)(迭代法)

算法分析与设计实验报告第三次附加实验

附录: 完整代码(回溯法) //回溯算法递归回溯n皇后问题#include #include #include #include"math.h" using namespace std; class Queen

{ friend int nQueen(int); //定义友元函数,可以访问私有数据 private: bool Place(int k); //判断该位置是否可用的函数 void Backtrack(int t); //定义回溯函数 int n; //皇后个数 int *x; //当前解 long sum; //当前已找到的可行方案数 }; int main() { int m,n; for(int i=1;i<=1;i++) { cout<<"请输入皇后的个数:"; //输入皇后个数 cin>>n; cout<<"皇后问题的解为:"<

八皇后问题的解决完整文档

淮阴工学院 数据结构课程设计报告 设计题目:八皇后 系(院):计算机工程系 专业:信息安全 班级:信息 1 0 6 学生姓名: 叶青学号:1061303127 指导教师:张亚红寇海洲胡荣林夏森 学年学期: 2007 ~ 2008 学年第 2 学期 2008 年 6 月25 日

设计任务书

摘要: 八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击.按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子.因此,八皇后问题等于要求八个皇后中的任意两个不能被放在同一行或同一列或同一斜线上。 而本课程设计本人的目的也是通过用c++语言平台将一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击的92种结构予以实现.使用递归方法最终将其问题变得一目了然,更加易懂。 关键词:八皇后; c++; 递归法

目录 1. 课题综述 (1) 1.1课题的来源及意义 (1) 1.2面对的问题 (1) 2. 需求分析 (1) 2.1涉及到的知识 (1) 2.2软硬件的需求 (1) 2.3功能需求 (2) 3. 概要设计 (2) 4. 详细设计和实现 (2) 4.1算法描述及详细流程图 (2) 4.1.1算法描述 (3) 4.1.2算法流程图 (3) 5. 代码编写及详细注释 (4) 6. 程序调试 (7) 6.1调试过程、步骤及遇到的问题 (7) 7. 运行与测试 (7) 7.1运行演示 (7) 总结 (9) 致谢 (10) 参考文献 (11) .

相关主题
文本预览
相关文档 最新文档