八皇后实验报告

合集下载

八皇后问题作品报告

八皇后问题作品报告

八皇后问题作品报告八皇后问题:国际象棋中,皇后可以在横、竖、斜线上不限步数地吃掉其他棋子,如何将8个皇后放在8×8的棋盘上,使得它们不能互相攻击源代码://八皇后问题源代码#include ""#define N 9int locate[N]={0};//0号单元不用,locate[m]=n表示第m行第n列中放入皇后int num=0;//用来标记八皇后的解法种类void Trial(int i,int n){int m,p,q;if (i>n){for(m=1;m<N;m++){printf("(%d,%d) ",m,locate[m]);}num++;printf("\n");}else{for(p=1;p<N;p++){for(q=1;q<i;q++){//用行进行的选择,排除同一列,同一对角线上的情况if (p==locate[q]||p==locate[q]+(i-q)||p==locate[q]-(i-q)){break;}}if (q==i){locate[i]=p;Trial(i+1,N-1);}}}}void main(){int j;for(j=1;j<N;j++){locate[1]=j;Trial(2,N-1);}printf("八皇后问题的答案总数num=%d\n",num);}使用方法:上述程序采用了递归调用和近似于枚举的方法。

本程序采用一行一行进行搜索,排除同一列(p==locate[q]),同一对角线上(p==locate[q]+(i-q)||p==locate[q]-(i-q))的位置,然后进行递归。

结果展示:。

完整word版,C++课程设计实践报告书-八皇后问题

完整word版,C++课程设计实践报告书-八皇后问题

课程设计报告设计题目:对八皇后问题进行求解学生姓名:专业:计算机科学与技术班级: 09-2学号:指导教师:李俊照完成日期: 2010-5-30合肥工业大学计算机与信息学院(一)需求和规格说明在 8 行 8 列的棋盘上放置8 个皇后,使任一个皇后都不能吃掉其他的7 个皇后(注:皇后可吃掉与她处于同行或同列或同一对角线上的其他棋子),并将结果以某种方式显示出来。

例如,当求出下述的一个解时,可输出如下信息来表示该解(输出了表示摆放皇后的坐标位置以及“棋盘状态”—棋盘中有皇后的位置放一个“Q”字符,其他位置为“ +”字符)。

(1,1) (5,2) (8,3) (6,4) (3,5) (7,6) (2,7) (4,8)Q+++++++++++++Q+++++Q++++++++++Q+Q+++++++++Q+++++++++Q++++Q+++++(二)设计(1)通过“ int LineNum[9]; bool a[9], b[15], c[15]; ”说明具有全局作用域的 4 个数组。

其中的:LineNum[i] 表示第 i 列的皇后要放的行位置(只用其中的列号1到 8);a[i] 为 true ( i =1 , 2,⋯, 8)表示第 i 行上尚未放皇后;b[i] 为 true ( i =0 , 1, 2,⋯, 14)表示第 i 条斜对角线上尚未放皇后(斜对角线指的是“/ ”状对角线,该对角线上各点的行列号之和i+j 为一个常数);c[i] 为 true ( i=0 , 1, 2,⋯, 14)表示第 i 条反斜对角线上尚未放皇后(反斜对角线指的是“ ”状对角线,该对角线上各点的行列号之差i-j 为一个常数)。

从而当使用语句“ if ( a[j] && b[i+j-2] && c[i-j+7] ) LineNum[i]=j; ”时,可用于判断并实现:如果在第j 行的第 i 列上放置皇后安全的话,则将一枚皇后放置到那儿。

数据结构 八皇后问题 报告

数据结构 八皇后问题 报告

数据结构实验报告实验名称:实验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. 程序运行结果程序实现八皇后问题:经过测试,程序运行良好,无明显错误。

八皇后问题课程设计报告

八皇后问题课程设计报告

数据结构课程设计报告设计题目:八皇后问题系(院):数学学院专业:信息与计算科学班级:02班学生姓名王天宇学号:指导教师:设计任务书1. 课题综述1. 1课题的来源及意义八皇后问题是一个古老而着名的问题,该问题是十九世纪着名的数学家高斯1850年提出的。

在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。

所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。

到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。

运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。

1. 2 面对的问题1)解决冲突问题:这个问题包括了行,列,两条对角线;列:规定每一列放一个皇后,不会造成列上的冲突;行:当第I行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I为下标的标记置为被占领状态;2)使用数据结构的知识,用递归法解决问题。

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

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

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

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

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

回溯算法实验报告

回溯算法实验报告

回溯算法实验报告实验目的:回溯算法是一种递归算法,通常用于解决有限集合的组合问题。

本实验旨在通过实现回溯算法来解决一个具体的问题,并对算法的性能进行评估。

实验内容:本实验将以八皇后问题为例,展示回溯算法的应用。

八皇后问题是一个经典的问题,要求在一个8x8的棋盘上放置8个皇后,使得任意两个皇后不能在同一行、同一列或同一对角线上。

算法步骤:1. 创建一个二维数组,表示棋盘。

初始化所有元素为0,表示棋盘上无皇后。

2. 逐行进行操作,尝试在每一列放置皇后。

在每一列,从上到下逐个位置进行尝试,找到一个合适的位置放置皇后。

3. 如果找到合适的位置,则将该位置标记为1,并向下一行进行递归操作。

4. 如果当前位置无法放置皇后,则回溯到上一行,尝试放置皇后的下一个位置。

5. 当所有皇后都放置好后,得到一个解。

将该解加入结果集中。

6. 继续回溯,尝试寻找下一个解。

7. 当所有解都找到后,算法终止。

实验结果:在本实验中,我们实现了八皇后问题的回溯算法,并进行了性能测试。

根据实验结果可以看出,回溯算法在解决八皇后问题上表现出较好的性能。

实验中,我们使用的是普通的回溯算法,没有进行优化。

对于八皇后问题来说,回溯算法可以找到所有解,但是随着问题规模的增加,算法的执行时间也会大大增加。

回溯算法是一种非常灵活的算法,可以用于解决各种组合问题。

对于规模较大的问题,回溯算法的时间复杂度很高,需要考虑优化算法以提高性能。

在实际应用中,可以结合其他算法,如剪枝等技巧,来改进回溯算法的性能。

回溯算法是一种非常有价值的算法,值得进一步研究和应用。

6八皇后问题(解空间搜索法)

6八皇后问题(解空间搜索法)
实验代码:
#include <stdio.h>
#include <stdlib.h>
#define max 8
int queen[max], sum=0;/* max为棋盘最大坐标*/
void show()/*输出所有皇后的坐标*/
{
int i;
for(i = 0; i < max; i++)
{
printf("(%d,%d) ", i, queen[i]);
一、实验目的
通过编程实现八皇后问题,增强对解空间搜索方法的理解。
二、实验内容
编程用解空间搜索的方法求解八皇后问题,并完成实验报告(要求粘贴代码和实验结果截图)。
三、实验步骤和过程
很多问题的求解过程就是一个在解空间搜索的过程,对于很多问题,解空间就是一颗树,我们可以分别用回溯法和分支界限法求解解空间搜索问题,在加空间搜索中最重要的就是及时的剪枝,去除不需要计算的部分。八皇后问题的求解过程就充分体现了这个方法。
天津商业大学学生实验报告
开课实验室:403机房开课时间2015年3月1日实验报告2015年4月14日
学院名称
信息工程学院
年级、专业、班
计科1303班
学号
20134390
姓名
吴雪婷
同组姓名

课程名称
算法分析与设计
实验项目名称
八皇后问题(解空间搜索法)
指导教师
杨亮
实验类型
验证□√综合□设计□创新□
成绩
实验报告内容一般包括以下几个内容:1、目的要求2、仪器用具及材料(仪器名称及主要规格、用具名称)3、实验内容及原理(简单但要抓住要点,写出依据原理)4、操作方法与实验步骤5、数据图表格(照片)6、实验过程原始记录7数据处理及结果(按实验要求处理数据、结论)8、讨论(对实验中存在的问题、进一步的想法等进行讨论)

4八皇后问题

实验四八皇后问题
一、目的和要求
1. 掌握递归的使用方法。

2. 掌握回溯法。

二、实验内容
八皇后问题是十九世纪著名的数学家高斯提出的:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻(任意两个皇后都不能处于同一行、同一列或同一斜线上),问有多少种摆法?输出所有的皇后摆法。

三、算法:
提示:
1.皇后q1(x1,y1)和皇后q2(x2,y2)相互吃掉的条件:
x1 == x2 || y1 == y2 || x1 – x2 == y1 – y2 || x1 – x2 == y2 – y1
2.用回溯法解决八皇后问题的步骤为:
用一个数组存储当前成功摆放的皇后位置,以便下一列摆放皇后时进行安全判断。

因为一列(行)只能摆放一个皇后,否则会互相吃掉,所以可以用列(行)号来作为递归函数的n
1)从第1列开始,为皇后找到安全位置,然后递归进行下一列。

2) 如果在第8列上找到了安全位置,则棋局成功,输出此种摆放下所有皇后的位置信息。

3) 如果在第n列出现死胡同(在所有位置都不能安全摆放皇后了),则后退到上一列进行回溯(如果用递归实现,该回溯是递归调用自动完成)。

程序请自行设计。

算法设计与实验分析五:八皇后问题

算法设计与实验分析无五:八皇后问题班级:网络1101姓名:xx学号:日期:2013.5.21一:实验名称:八皇后问题二:实验内容:在8×8格的国际象棋上摆放八皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

虽然问题的关键在于如何判定某个皇后所在的行、列、斜线是否有别的皇后;可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列号相同;如果同在“/”斜线上的行列值之和相同;如果在对角线上,则行列号之和或之差相等,逐个纪录符合题意的情况,最终得出解。

回溯法:回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。

按选优条件向前搜索,以达到目标。

但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。

三:程序清单:#include<iostream.h>#include<iomanip.h>#include<stdlib.h>#include<stdio.h>1staticcharQueen[8][8];staticinta[8];staticintb[15];staticintc[15];staticintiQueenNum=0;staticintiNum=1;voidiQueen(inti);voidmeasure1(){};voidiQueen(inti){intiColumn;for(iColumn=0;iColumn<8;iColumn++)if(a[iColumn]==0&&b[i-iColumn+7]==0&&c[i+iColumn]==0){Queen[i][iColumn]='@';a[iColumn]=1;intiLine;intiColumn;{for(iColumn=0;iColumn<8;iColumn++)}for(iLine=0;iLine<15;iLine++) b[iLine]=c[iLine]=0;iQueen(0);Queen[iLine][iColumn]='*';for(iLine=0;iLine<8;iLine++)a[iLine]=0;{b[i-iColumn+7]=1;c[i+iColumn]=1;if(i<7){intiLine;intiColumn;cout<<"(递归法)皇后摆放方式的第"<<iNum<<"种情况为:"<<endl;for(iLine=0;iLine<8;iLine++){for(iColumn=0;iColumn<8;iColumn++)cout<<setw(2)<<Queen[iLine][iColumn];iQueen(i+1);elsecout<<endl;cout<<iNum<<":";for(iLine=0;iLine<8;iLine++){for(iColumn=0;iColumn<8;iColumn++){if(Queen[iLin e][iColumn]=='@')cout<<"("<<iLine+1<<','<<iColumn+1<<")";}}}}Queen[i][iColumn]='*';a[iColumn]=0;b[i-iColumn+7]=0;c[i+iColumn]=0;}}}cout<<endl;system("pause>nul");iNum++; cout<<endl; 运行结果:。

八皇后

数据结构作业报告——八皇后姓名:李慧卓班级:071121班学号:07112012上机时间:2012-12-17报告时间:2013-01-05摘要1.实验目的熟悉树中回溯法与树的遍历。

2.实验方法本程序利用if函数中的条件判断,辅之循环,按要求摆放棋子。

总共有3个子函数,分别为显示结果函数,检查合法函数,置棋函数。

3.实验结果运行结果显示了符合规则的所有摆放八皇后的方法。

内容一.问题重述在8*8的棋盘上,摆放八个皇后,是之不能相互攻击,即任意两个棋子不在同一列、行、斜线上。

显示所有摆法。

二.算法描述四.函数与思路说明本函数运用了条件语句,其中最重要的判断是否合法即用if条件判断实现。

运用树的概念进行列举而后判断。

本程序总共有3子函数,1个主函数,其中3个子函数分别为show_result()子函数,check_cross ()子函数,put_chess ()子函数。

五.程序执行结果六.结论参考列子,在根据实际情况调整编改,运行成功。

七.编程中遇到的问题以及解决方法参考网范例发现函数构成比较简单。

修改了头文件对getch(),puts()进行了了解。

八.附录#include "stdafx.h"#include <stdio.h>#include <conio.h> //配合getch()使用#include <math.h>#define MAX 8 /*棋子数及棋盘大小MAX*MAX*/int board[MAX];void show_result(){int i;for(i=0;i<MAX;i++)printf("(%d,%d)",i,board[i]);printf("\n");}/*检查在同一直线上是否有其他的棋子*/int check_cross(int n){int i;for(i=0;i<n;i++) //i小于n,只需与之前的比较{if(((board[i])==(board[n]))||((n-i)==abs((board[i])-(board[n])))) return 1;}return 0;}/*放棋子到棋盘上*/void put_chess(int n){int i;for(i=0;i<MAX;i++){board[n]=i;if(!check_cross(n)){if(n==MAX-1)show_result();/*找到其中一种方法打印出结果*/elseput_chess(n+1);}}}void main(){puts("The possible placements are:");put_chess(0);puts("\nPress any key to quit ...");getch(); ///利用它来实现程序运行完了暂停不退出的效果。

河师大算法设计与分析N皇后问题实验报告

计算机与信息技术学院实验报告专业:计算机科学与技术年级/班级:2009级 2011—2012学年第一一、实验项目N皇后问题二、需求分析八皇后问题是一个古老而著名的问题。

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

八皇后问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既不攻击到另外七个皇后,也不被另外七个皇后所攻击。

按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子,问有多少种不同的摆法:并找出所有的摆法。

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

本次实验算法设计中,用到的主要知识有:递归法的运用,for 语句的灵活运用,数据结构中树知识的灵活运用、数组及动态数组技术的掌握。

系统要求:win98 以上操作系统;语言平台:vc++6.0 或以上版本。

根据程序的设计要求,需要设计一个八皇后问题的演示程序,程序需要具备以下功能:能够快速查找并显示八皇后的布局方式有多少种正确方法。

能够逐个查看每种布局的结果。

能够很方便的改变皇后个数即棋盘规格。

三、概要设计:本实验是用递归和回溯法来实现的,分别测试了每一种摆法,并将一个解图形化显示输出。

在这程序中,思路主要是这样的:1、解决冲突问题和数据结构的实现对于数据结构的实现,则是着重于:(1)数组x[i]:表示第i个皇后放置的列;i的范围:0—n-1;(2)数据初始化(3)从n列开始摆放第n个皇后(因为这样便可以符合每一竖列一个皇后的要求),先用xx函数测试当前位置是未被占领;如果是,摆放第n-1个皇后后并宣布占领,接着进行递归;如果不是,测试下一个位置(n,m+1),但是如果当n<=8,m=8时,却发现此时已经无法摆放时,便要进行回溯。

(4)当n=8时,便一一打印出结果。

)首先定义一个递归找全部的解的递归函数FindQueen(int i),设有一个参数i,表示1至i-1行都已有皇后合理放置的情况下,寻找第i行的合理放置。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

第1页/共5页
实验名称:编程实现八皇后问题(验证性实验)
实验目标:
使用深度优先搜索算法以及回溯法的思想进行暴力解题

实验任务:
用8*8的二维数组去模拟皇后所在的棋盘,然后用1标记该位置

可以放皇后,用0来标记该位置不可以放皇后。然后每次有一个
合理的八皇后方案,就会counter++,记录摆放的方法,并且输出
皇后摆放的坐标。

实验步骤:
1.明确实验目标和实验任务

2.理解实验所涉及到深度优先搜索的算法以及回溯法的思想
3.编写程序实现求解八皇后问题。
4.设计实验数据数据并运行程序,记录运行的结果

程序代码:
/********************************************************************
***
这个题目我默认第一个皇后放第一行,第二个皇后放第二行,如此类推。
*********************************************************************
**/

#include
using namespace std;
struct chessboard
{
int b[8][8]; //对棋盘的模拟
};

struct location
{
int x,y; //记录皇后放的坐标
};

chessboard visited[9];
location loc[8];
int num; //记录有多少种方法

void print() //输出皇后的方法以及种数
{
int i;
cout<<++num<for(i=0;i<=7;i++)
{
第2页/共5页

cout<}
cout<}

int x1,y1,x2,y2; //用于标记坐标
void visit(int x,int y,int step)
{
int i;
x1=x;
y1=y;
x2=x;
y2=y;
visited[step]=visited[step-1]; //把上一次标记过不能走的坐标传到下一

for(i=0;i<8;i++)
{
visited[step].b[x][i]=0; //与皇后同行的都标为不能放
visited[step].b[i][y]=0; //与皇后同列的都标为不能放
}
while(x1<8 && y1<8)
{
visited[step].b[x1][y1]=0; //与皇后对角线的标记为不能放
x1++;
y1++;
}
while(x2<8 && y2>=0)
{
visited[step].b[x2][y2]=0; //与皇后对角线的标记为不能放
x2++;
y2--;
}
}

void dfs(int step)
{
int j;
if(step==9)
{
print();
}
else
{
第3页/共5页

for(j=0;j<8;j++)
{
if(visited[step-1].b[step-1][j])
{
loc[step-1].x=step-1; //放置皇后的位置
loc[step-1].y=j;
visit(step-1,j,step); //进行标记
dfs(step+1); //递归进行下一个
}
}
}
}

int main()
{
num=0; //初始化计数变量num
memset(visited,1,sizeof(visited)); //初始化visited标记数组
dfs(1); //从1开始,1作为步骤参

return 0;
}

数据测试:
第4页/共5页
第5页/共5页
实验小结:
首先是八皇后问题。关于八皇后问题,主要是先对回溯法进行理解。毕竟
理解不了回溯法,就无法写递归程序。在做的时候简化了一下过程。把第一个皇
后就放第一排,第二个皇后放第二排,而不是随机放的,降低了代码难度和复杂
度。另外在回溯的时候,要做好标记,包括放下皇后的时候也要做好标记,标记
好不能放的地方。

相关文档
最新文档