数据结构课程设计报告-8皇后问题

合集下载

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

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

数据结构与算法专题实验实验报告_八皇后_背包问题的求解_农夫过河实验报告:数据结构与算法专题实验报告实验题目:八皇后问题的求解与背包问题的求解实验目的: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为背包的承重量。

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

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

算法设计与分析实验报告—八皇后问题-姓名:***学号:********班级:软件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++)cout << '(' << k+1 << ',' << x[k] << ") ";cout << endl;cout << "---------------------------------\n";for (int i = 0; i < N; i ++){for (int j = 0; j < N; j ++)if (j == x[i]) //printf("@ ");cout << "* | ";else //printf("* ");cout << " | ";cout << "\n---------------------------------\n";}}/* 确定某一位置皇后放置与否,放置则返回1,反之返回0 */int Judge(int k){// 测试皇后k在第k行第x[k]列时是否与前面已放置好的皇后相攻击。

C++课程设计八皇后问题

C++课程设计八皇后问题

安徽建筑工业学院数据结构设计报告书院系数理系专业信息与计算科学班级11信息专升本学号11207210138姓名李晓光题目八皇后指导教师王鑫1.程序功能介绍答:这个程序是用于解决八皇后问题的。

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

做这个课题,重要的就是先搞清楚哪个位置是合法的放皇后的位置,哪个不能,要先判断,后放置。

我的程序进入时会让使用者选择程序的功能,选【1】将会通过使用者自己手动输入第一个皇后的坐标后获得答案;选【2】将会让程序自动运算出固定每一个皇后后所有的排列结果。

2.课程设计要求答:(1)增加函数,完成每输入一组解,暂停屏幕,显示“按任意键继续!”。

(2)完善程序,编程计算八皇后问题共有集中排列方案。

(3)增加输入,显示在第一个皇后确定后,共有几组排列。

(4)将每组解的期盼横向排列输出在屏幕上,将五个棋盘并排排列,即一次8行同时输出5个棋盘,同样完成一组解后屏幕暂停,按任意键继续。

(5)求出在什么位置固定一个皇后后,解的数量最多,在什么位置固定皇后后,解的数量最少,最多的解是多少,最少的解是多少,并将最多,最少解的皇后位置及所有的解求出,同样5个一组显示。

3.对课程题目的分析与注释答:众所周知的八皇后问题是一个非常古老的问题,问题要求在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击。

按照国际象棋的规则,一个皇后可以攻击与之处在同一行或同一列或同一斜线上的其他任何棋子。

因此,本课程设计的目的也是通过用C++语言平台在一个8*8的棋盘上放上8个皇后,使得每一个皇后既攻击不到另外七个皇后,也不被另外七个皇后所攻击的92种结构予以实现。

使用递归方法最终将其问题变得一目了然,更加易懂。

首先要用到类,将程序合理化:我编辑了一个盘棋8*8的类:class Board,还有个回溯法的类:class Stack,关键的类好了,然后编辑好类的成员,然后编辑主函数利用好这些类的成员,让其运算出结果。

数据结构 八皇后问题 报告

数据结构 八皇后问题 报告

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

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

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

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]里不同下标的两个元素。

(完整word版)数据结构课程设计之_八皇后问题

(完整word版)数据结构课程设计之_八皇后问题

课程设计报告课程名称数据结构课程设计课题名称八皇后问题演示专业通信工程班级通信工程1081学号201013120103姓名刘献文指导教师田娟秀郭芳2012年7 月 6 日湖南工程学院课程设计任务书课程名称数据结构课题八皇后问题演示专业班级通信工程1081学生姓名刘献文学号201013120103指导老师田娟秀郭芳审批任务书下达日期2012 年7 月 1 日任务完成日期2012 年7 月 6 日1设计内容与设计要求1。

1设计内容(4)课题四:八皇后问题演示八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。

该问题是十九世纪著名的数学家高斯1850年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

高斯认为有76种方案。

1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。

设计思路: 解决8皇后时,在安放第i行皇后时,需要在列的方向从1到n试探(j =1,…, n):首先在第j列安放一个皇后,如果在列、主对角线、次对角线方向有其它皇后,则出现攻击,撤消在第j列安放的皇后。

如果没有出现攻击,在第j列安放的皇后不动,递归安放第i+1行皇后。

对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象、更生动.要求用Turbo C或VC6.0 MFC实现的八皇后问题的图形程序,能够演示全部的92组解.1。

2 选题方案:所选题目根据学号确定,学号模6加1,即(学号%6+1).如你的学号为9,则所选题目号为:9%6+1=(题目4)。

注意,所有的课题都要求用图形方式演示步骤和结果。

同学们可以自己针对数据结构课程中所讲算法来设计一个演示过程的算法。

1.3设计要求:1。

3.1 课程设计报告规范(1)需求分析a.程序的功能。

b.输入输出的要求。

(2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

北邮数据结构实验二八皇后问题

北邮数据结构实验二八皇后问题

数据结构实验报告实验名称:学生姓名:班级:班内序号:学号:日期:一.实验描述: 利用栈结构实现八皇后问题。

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

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

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

三.程序分析1.存储结构: 栈2.关键算法分析:a)比较函数: 比较某两个皇后是否在同一横、竖、斜线上。

行数:a和b。

列数:row[a]和row[b]。

主对角线数:(a+row[a])和(b+row[b])。

副对角线数:(a+7-row[a])和(b+7-row[b])。

b)八皇后实现(非递归):放置每一行的皇后时, 考虑其与已放好的之前行是否存在矛盾, 并作出相应的退栈、进栈或改变位置的反应。

放置完8行后, 计算下一个解。

当最后取得的解与第一个解重复时, 已取得全部解, 结束程序。

3.代码详细分析:#include<iostream>using namespace std;bool CompArray(int a[],int b[],int n)//用来比较两组解是否相等的函数{bool e=1;for(int i=0;i<n;i++){if(a[i]!=b[i])e=0;}return e;}class Stack //栈{public:Stack();void Push(int n);void Pop();bool Compare(int a,int b);void EightQueen();private:int row[8];//row[i]代表第i行皇后的列数是row[i], 因为八皇后不同行, 所以每行都有且只有一个皇后int top;};Stack::Stack() //置空栈{top=-1;}void Stack::Push(int n) //压栈函数{row[++top]=n; //int n进栈, top指针+1}void Stack::Pop() //退栈函数{top-=1; //top指针-1}bool Stack::Compare(int a,int b) //比较函数, 比较某两个皇后是否在同一行、列或对角线上{return row[a]==row[b]||(a+row[a])==(b+row[b])||(a+7-row[a])==(b+7-row[b]);} /*输入的行数a和b本来就不相等比较列数row[a]和row[b]是否相等比较主对角线数(a+row[a])和(b+row[b])是否相等比较副对角线数(a+7-row[a])和(b+7-row[b])是否相等bool输出0表示以上均不相等*/void Stack::EightQueen() //八皇后判断函数{int count=0; //计数量, 计解的个数int a[8]; //存储数组, 存储第一个解以便比较while(1) //控制每次进栈的大循环{Push(0);//为当前指针所指的下一位进栈0, 表示上一行皇后位置判断完成, 进入下一行判断loop:for(int j=0;j<top;j++)//将当前指针所在行与之前每一行进行对比, 以判断本行当前列是否可放置皇后的比较循环{if(Compare(top,j)!=0){row[top]++;//如果有任何一次比较的结论是不可放置, 本行的列数+1while(1)//如果列数+1之后超出8列, 则退栈, 给上一行列数加1, 如再超列再退栈, 以此类推{if(row[top]>7){Pop();row[top]++;}else break;}goto loop;//进行下一次比较循环}}if(top==7)//如果top=7, 说明已经判断完了第8行, 可以输出解{if(count==0)//用a[]记录第一个解{for(int i=0;i<8;i++){a[i]=row[i];}}else{if(CompArray(a,row,8)==1)break;//当再次求出的解与第一个解相同时, 说明已经输出了全部的解, 将不再输出}count++;//解的计数量+1cout<<"第"<<count<<"个解:"<<endl;//输出解for(int i=0;i<8;i++){cout<<"第"<<i+1<<"个皇后在第"<<i+1<<"行, 第"<<row[i]+1<<"列"<<endl;}cout<<endl;row[top]++;//本次求解后, 给第8行列数+1, 以进行下一次求解while(1)//超列则当前位列数置零, 退栈后列数+1{if(row[top]>7){row[top]=0;row[--top]++;}else break;}goto loop;//进入比较循环, 开始下一次求解}}}main(){Stack S1;S1.EightQueen();}a) 4.时间复杂度计算: (皇后数为n,解的个数为m)某一行取某个值时与之前每行比较: O(n)。

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

北邮信通院数据结构实验二--八皇后问题实验报告(内附源代码完整版)
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. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计姓名:学号:指导老师:目录一.选题概述---------------------------------------3二.设计要求与分析--------------------------------3三.数据结构与定义--------------------------------41.结构体定义2.函数定义3.函数之间的定义四.程序段与分析----------------------------------5五.完整程序代码及运行结果截图------------------7六.心得体会--------------------------------------10七.参考文献--------------------------------------10一.选题概述:在实际应用中,有相当一类问题需要找出它的解集合,或者要求找出某些约束条件下的最优解。

求解时经常使用一种称为回溯的方法来解决。

所谓回溯就是走回头路,该方法是在一定的约束条件下试探地搜索前进,若前进中受阻,则回头另择通路继续搜索。

为了能够沿着原路逆序回退,需用栈来保存曾经到达的每一个状态,栈顶的状态即为回退的第一站,因此回溯法均可利用栈来实现。

而解决八皇后问题就是利用回溯法和栈来实现的。

二.设计要求与分析八皇后问题是在8x8的国际象棋棋盘上,安放8个皇后,要求没有一个皇后能够“吃掉”任何其他一个皇后,即没有两个或两个以上的皇后占据棋盘上的同一行、同一列或同一条对角线。

八皇后在棋盘上分布的各种可能的格局,其数目非常大,约等于232种,但是,可以将一些明显不满足问题要求的格局排除掉。

由于任意两个皇后不能同行,即每一行只能放置一个皇后,因此将第i个皇后放置在第i行上。

这样在放置第i个皇后时,只要考虑它与前i 一1个皇后处于不同列和不同对角线位置上即可。

因此,其算法基本思想如下:从第1行起逐行放置皇后,每放置一个皇后均需要依次对第1,2,…,8列进行试探,并尽可能取小的列数。

若当前试探的列位置是安全的,即不与已放置的其他皇后冲突,则将该行的列位置保存在栈中,然后继续在下一行上寻找安全位置;若当前试探的列位置不安全,则用下一列进行试探,当8列位置试探完毕都未找到安全位置时,就退栈回溯到上一行,修改栈顶保存的皇后位置,然后继续试探。

该算法抽象描述如下:(1)置当前行当前列均为1;(2)while(当前行号《8)(3){检查当前行,从当前列起逐列试探,寻找安全列号;(4)if(找到安全列号)(5)放置皇后,将列号记入栈中,并将下一行置成当前行,第1列置为当前列;(6)else(7)退栈回溯到上一行,移去该行已放置的皇后,以该皇后所在列的下一列作为当前列;(8)}结束程序。

三.数据结构与定义1.结构体定义typedef struct{int col[MaxSize]; //col[i]存放第i个皇后的列号int top; //栈顶指针}Type;2.函数定义bool place(Type st,int i,int j) //测试(i,j)是否与1~i-1皇后有冲突void queen(int n) //求解皇后问题void main() //主函数3.函数之间的调用关系main queen place四.程序块与分析bool place(Type st,int i,int j)//测试(i,j)是否与1~i-1皇后有冲突{int k=1;if(i==1) return true;//存放第一个皇后时没有冲突while(k<=i-1)//j=1到k-1是已经放置了皇后的列{if((st.col[k]==j)||(abs(j-st.col[k])==abs(k-i)))return false;k++;}return true;}(k,st.col[k])(k,st.col[k])j-st.col[k] j-st.col[k](i,j) i-k i-k (i,j)//测试(i,j)位置是否与已经放好的第1个到第i~1皇后有冲突。

已经放置好的第1个到第1~i-1 个皇后已放置在st栈中。

St栈用的是顺序栈,栈顶指针从1开始,st.col[k]用于存放第k(1<=i<=k-1)个皇后的列号,即皇后的位置是(k,st.col[k])。

对于(i,j)位置上的皇后与已经放置的皇后(k,st.col[k])发生冲突的情况时,则有:st.col[k]==j;对角线的冲突情况是:|j-st.col[k]|==|k-i|。

void queen(int n)//求解n皇后问题{int i,j,k;bool find;Type st;//定义栈stst.top=0;//初始化栈顶指针st.top++;//将(1,1)放进栈st.col[st.top]=1;while(st.top>0)//栈不空时循环{i=st.top;//当前皇后为第i个皇后if(st.top==n)//所有皇后都放置好了,输出一个解{printf("第%d个解:",++count);for(k=1;k<=st.top;k++)printf("(%d,%d)",k,st.col[k]);printf("\n");}find=false;for(j=1;j<=n;j++){if(place(st,i+1,j))//在i+1行找到一个放置皇后的位置(i+1,j){st.top++;st.col[st.top]=j;find=true;break;}}if(find==false)//在i+1行找不到放皇后的位置,回溯{while(st.top>0){if(st.col[st.top]==n)//本行也没有可放的位置,则退栈st.top--;for(j=st.col[st.top]+1;j<=n;j++)//在本行的下一个位置找if(place(st,st.top,j)){st.col[st.top]=j;break;}if(j>n)//当前皇后在本行没有可放的位置st.top--;//退栈else//本行找到一个位置后,推出回溯break;}}}}void main() //主函数{int n;printf("请输入皇后个数n=");scanf("%d",&n);printf("%d皇后问题求解如下:\n",n);queen(n);printf("\n");}五.完整程序代码及运行结果截图#include <stdio.h>#include <stdlib.h>#define MaxSize 100typedef struct{int col[MaxSize];//col[i]存放第i个皇后的列号int top;//栈顶指针}StType;//定义顺序栈类型int count=0;bool place(StType st,int i,int j)//测试(i,j)是否与1~i-1皇后有冲突{int k=1;if(i==1) return true;//存放第一个皇后时没有冲突while(k<=i-1)//j=1到k-1是已经放置了皇后的列{if((st.col[k]==j)||(abs(j-st.col[k])==abs(k-i)))return false;k++;}return true;}void queen(int n)//求解n皇后问题{int i,j,k;bool find;StType st;//定义栈stst.top=0;//初始化栈顶指针st.top++;//将(1,1)放进栈st.col[st.top]=1;while(st.top>0)//栈不空时循环{i=st.top;//当前皇后为第i个皇后if(st.top==n)//所有皇后都放置好了,输出一个解{printf("第%d个解:",++count);for(k=1;k<=st.top;k++)printf("(%d,%d)",k,st.col[k]);printf("\n");}find=false;for(j=1;j<=n;j++)if(place(st,i+1,j))//在i+1行找到一个放置皇后的位置(i+1,j){st.top++;st.col[st.top]=j;find=true;break;}if(find==false)//在i+1行找不到放皇后的位置,回溯{while(st.top>0){if(st.col[st.top]==n)//本行也没有可放的位置,则退栈st.top--;for(j=st.col[st.top]+1;j<=n;j++)//在本行的下一个位置找if(place(st,st.top,j)){st.col[st.top]=j;break;}if(j>n)//当前皇后在本行没有可放的位置st.top--;//退栈else//本行找到一个位置后,推出回溯break;}}}}void main(){int n;printf("请输入皇后个数n=");scanf("%d",&n);printf("%d皇后问题求解如下:\n",n);queen(n);printf("\n");}六.心得体会1.善于学习别人,多请教牛人,才会更快提高自己。

有些问题也许就是自己在某一点想不通,想法转不过来,这就消耗了很多时间。

而经过牛人的点拨问题就解决了,牛人们也会更直接,更清晰的教导一些技术,通过向他们学习,才会更快的提高自己的技能。

2.多找一些题目来练习,多敲代码,才会更有感觉。

在练习的过程中找出规则,形成编程思想。

3.小组合作形成共同进步。

小组成员的讨论过程中,将各自的想法提出来,分析优缺点,这过程中每个成员也可以学习到其他成员的解题思想,也可以审视自己的解题思想,获得提升。

七.参考文献1.数据结构(C语言版)严蔚敏,吴伟民清华大学出版社2.C语言程序设计何钦铭,颜晖高等教育出版社3.数据结构教程李春葆清华大学出版社。

相关文档
最新文档