数据结构课程设计之_八皇后问题

合集下载

八皇后问题 N皇后问题 C++

八皇后问题 N皇后问题 C++

数据结构课程设计第4题yuhao2015-11-8目录1系统分析 (2)1.1项目需求分析 (2)1.2系统功能分析 (2)1.2.1功能函数(Function) (2)1.2.2采用的数据结构介绍 (2)1.3系统需求分析 (2)2系统设计及其实现分析 (3)2.1系统总体设计 (3)2.2系统运行流程图 (3)2.3功能实现分析 (3)3系统测试 (4)4 Bug Report (5)5总结与分析 (5)1系统分析1.1项目需求分析此题为经典的八皇后问题的拓展版—N皇后问题,即用户可以自己输入皇后数。

八皇后问题是一个古老而著名的问题,是回溯算法的经典问题。

该问题是十九世纪著名的数学家高斯在1850年提出的:在8*8的国际象棋棋盘上,安放8个皇后,要求没有一个皇后能够“吃掉”任何其它一个皇后,即任意两个皇后不能处于同一行,同一列或者同一条对角线上,求解有多少种摆法。

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

由于任意两个皇后不能同行,即每行只能放置一个皇后,因此将第i个皇后放在第i航上,这样在放置第i个皇后时,只要考虑它与前i-1个皇后处于不同列和不同对角线位置上即可。

综上,解决这个问题的方法可以采用回溯法,首先将第一个皇后放置在第一行第一列,然后,依次在下一行上放置一个皇后,直到八个皇后全部放置安全。

在放置每个皇后时,都依次对每一列进行检测,首先检测放在第一列是否与已放置的皇后冲突,如不冲突,则将皇后放置在该列,否则,选择该行的下一列进行检测。

如整行的八列都冲突,则回到上一行,重新选择位置,依次类推。

1.2系统功能分析1.2.1功能函数(Function)本题先创建了一个Queen 的class,在class内定义并实现函数。

(1)void init(int n);初始化棋盘类;(2)intplaceable(int m, int n);判断棋盘上点是否可以放置皇后;(3)void print();输出符合条件的棋盘布局;(4)void queenSolve();棋盘搜寻函数,主功能函数。

数据结构与程序设计12八皇后问题

数据结构与程序设计12八皇后问题

Post: A queen has been inserted into the square at row count and column
col; count has been incremented by 1.
*/
{
queen_square[count++][col] = true;
}
7/25/2024
for (i = 0; ok && i < count; i++)
ok = !queen_square[i][col];
// Check upper part of column
for (i = 1; ok && count - i >= 0 && col - i >= 0; i++)
Байду номын сангаас
ok = !queen_square[count - i][col - i]; // Check upper-left diagonal
}
7/25/2024
数据结构与程序设计
11
Eight-Queens Puzzle p191
bool Queens::unguarded(int col) const
/*
Post: Returns true or false according as the square in the first
数据结构与程序设计
10
Eight-Queens Puzzle
Queens::Queens(int size)
/*
Post: The Queens object is set up as an empty

数据结构八皇后问题

数据结构八皇后问题

目录一需求分析............................................ 错误!未定义书签。

1.1程序的功能:...................................... 错误!未定义书签。

1.2程序的输入输出要求:.............................. 错误!未定义书签。

二概要设计............................................ 错误!未定义书签。

2.1程序的主要模块:.................................. 错误!未定义书签。

2.2程序涉及:........................................ 错误!未定义书签。

三详细设计............................................. 错误!未定义书签。

3.1相关代码及算法..................................... 错误!未定义书签。

3.1.1 定义相关的数据类型如下:...................... 错误!未定义书签。

3.1.2 主模块类C码算法:............................. 错误!未定义书签。

3.1.3 画棋盘模块类C码算法........................... 错误!未定义书签。

3.1.4 画皇后模块类C码算法:........................ 错误!未定义书签。

3.1.5 八皇后摆法模块(递归法):.................... 错误!未定义书签。

3.1.6 初始化模块.................................... 错误!未定义书签。

3.1.7 输出摆放好的八皇后图形(动态演示):.......... 错误!未定义书签。

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为一个常数)。

数据结构课程设计之八皇后问题

数据结构课程设计之八皇后问题

注意:本文编程使用c++!!!c语言编程在最后!!!目录一、需求分析 (1)二、概要设计 (3)三、详细设计 (5)四、调试分析及测试 (8)五、个人工作及创新 (12)六、小结 (12)参考文献 (13)附录 (13)一、需求分析八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的,并作了部分解答。

高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有76种不同的放法,这就是有名的“八皇后”问题。

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

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

现在我们已经知道八皇后问题有92个解答。

1.1 涉及到的知识点本次课程设计中,用到的主要知识有:递归法、回溯法的应用,for语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的掌握.下面给出八皇后问题回溯算法的伪代码PlaceQueen(row)for 第row行的各列colIf 位置(row,col)可以放置皇后在位置(row,col)放置一个皇后If(row<9)PlaceQueen(row+1);else成功,打印棋盘将位置(row,col)上的皇后取走,尝试下一列位置 //回溯其中回溯法的应用如下:回溯法也是设计递归过程的一种重要方法,原理或步骤为:试着先把第一个皇后放在棋盘上,然后再放第二个,使两个皇后不会互相攻击,再放第三个皇后,使得她与前面两个皇后都不会互相攻击,依此类推,直至所有的皇后都放上去。

如果第七个皇后放上后,第八个皇后已经没有安全的位置可以放置,则试着调试第七个皇后的位置,再尝试第八个皇后有没有安全的位置;如果第七个皇后的所有安全位置都已尝试过了,第八个皇后还是没有安全的位置,则试着调试第六个皇后的位置,重新放置第七、八个皇后的尝试。

(完整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.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

八皇后数据结构课程设计

八皇后数据结构课程设计

目录一.课程设计的目的 0二.功能说明 0三.详细设计 (1)3.1.功能模块设计 (1)3.1.1.主函数main()的执行流程 (1)3.1.2.创建模块 (1)3.1.3.操作模块 (2)3.1.4.显示模块 (2)3.2.数据结构设计 (2)3.2.1.定义全局变量.................................................................................... 错误!未定义书签。

3.2.2.散列表类模板的定义 (2)3.3.函数功能描述 (3)四.程序实现 (3)4.1.源码分析 (3)4.2.调试结果 (8)4.3.调试时遇到的问题及解决 (9)4.4.时间复杂度分析 (9)4.5.算法的改进设想 (9)结束语 (10)参考文献 (11)一.课程设计的目的1.理解与掌握散栈与队列这两种重要的数据结构。

2.站与队列的构造,多种操作。

3.设计功能完整的栈,队列,魔王语言翻译程序。

二.功能说明整个实验完成一个完整的魔王语言翻译,本实验中涉及到栈与队列的构造,插入,删除等。

整个程序由如下几大模块组成:1.创建模块。

创建模块创建栈与队列。

2.操作模块。

操作模块处理对入栈,队列的操作。

3.显示模块。

显示出处理后的魔王语言翻译结果。

创建栈与队列显示翻译结果处理输入的语言图1 功能模块图三. 详细设计3.1.功能模块设计3.1.1. 主函数main()的执行流程程序中只需要输入魔王语言,将其翻译成人类语言。

1. 创建:命令C ,创建栈与队列。

2. 输入魔王语言。

3. 处理魔王语言。

4. 退出:命令X ,退出程序。

执行流程如图:图2 主函数main()的流程图 3.1.2. 创建模块本模块创建栈与队列。

操作模块显示模块创建模块魔王语言翻译实验开始 调用main()函数输入魔王语言处理语言,完成相应功能结束3.1.3.操作模块1.输入魔王语言。

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

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

数据结构课程设计 回溯法解决8皇后n皇后问题

数据结构课程设计 回溯法解决8皇后n皇后问题

数据结构课程设计学院:信息科学技术学院专业:电子信息工程(1)姓名:谢后乐学号:20101601310015N皇后问题N皇后问题:在n×n格的棋盘上放置彼此不受攻击的n个皇后。

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

n后问题等价于再n×n的棋盘上放置n个皇后,任何2个皇后不妨在同一行或同一列或同一斜线上。

回溯法简介:回溯法(探索与回溯法)是一种选优搜索法,按选优条件向前搜索,以达到目标。

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

我们发现,对于许多问题,所给定的约束集D具有完备性,即i元祖(x1,x2,…,xi)满足D中仅涉及到x1,x2,…,xi的所有约束意味着j(j<=i)元组(x1,x2,…)一定也满足D中仅涉及到x1,x2,…,的所有约束,i=1,2,…,n。

换句话说,只要存在0≤j≤n-1,使得(x1,x2,…,)违反D中仅涉及到x1,x2,…,的约束之一,则以(x1,x2,…,)为前缀的任何n元组(x1,x2,…,j+1,…,)一定也违反D中仅涉及到x1,x2,…,xi的一个约束,n≥i≥j。

因此,对于约束集D具有完备性的问题P,一旦检测断定某个j元组(x1,x2,…)违反D中仅涉及x1,x2,…,的一个约束,就可以肯定,以(x1,x2,…)为前缀的任何n元组(x1,x2,…,)都不会是问题P的解,因而就不必去搜索它们、检测它们。

回溯法正是针对这类问题,利用这类问题的上述性质而提出来的比枚举法效率更高的算法。

空间树回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T,把在E中求问题P的所有解转化为在T中搜索问题P的所有解。

树T类似于检索树,它可以这样构造:设Si中的元素可排成xi(1) ,xi(2) ,...,xi(mi-1) ,|Si| =mi,i=1,2,...,n。

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

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

数据结构实验报告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]='#';说明:已放置皇后的行、列以及对角线都不能再放置皇后。

数据结构课程设计八皇后问题

数据结构课程设计八皇后问题
第一章 八皇后问题概述
1.1 课题的描
八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的。八皇后问题是在8*8的国际象棋棋盘上,安放8皇后,要求没有一个皇后能够“吃掉”任何其他一个皇后,即没有两个或两个以上的皇后占据棋盘上的同一行、 同一列、或同一对角线。
到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。
在编写代码时,我希望能随机选择一数 X(1~92)后,能输出该种情况所对应的八个皇后的摆放方式和每个皇后所在的位置,但想了好久,就是无法实现。而且,当92种情况都输出时,前面的几十种情况无法看到,要想让摆放皇后的图形和所在具体的位置一起输出,就得修改程序让使她们一个一个地输出,这样显然比较麻烦。倘若有一种既能把八皇后的所在位置和把皇后所有情况连续输出,我感觉就应该算是一个完美的程序了,这还需要我一致的探索发掘下去才行。
cout<<" "<<"-------------------------------------"<<endl;
Queen(0); //!从第0行开始递归试探。
getch();//!按任意键返回。
}
void Queen(int n) /*-----------------Queen:递归放置第n个皇后,程序的核心!----------------*/
但若输入数字0时,操作结束,退出程序。
使用多维数组输出魔方阵,分别用3个子函数实现相应的功能。

八皇后问题

八皇后问题

数据结构课程设计报告八皇后问题班级:***姓名:***学号:***八皇后问题1、问题分析八皇后问题是一个古老而著名的问题。

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

高斯认为有76种方案。

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

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

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

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

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

2、算法描述从第一行起逐行放置皇后,每放置一个皇后均需要依次对第1, 2・3列进行试探,并尽可能取小的列数。

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

该算法抽象的描述如下:(1) 置当前行当前列均为1;(2) While (当前行号v = 8);(3) {检查当前行,从当前列起逐列试探,寻找安全列号;(4) if (找到安全列号)(5) 放置皇后,将列号放入栈中,并将下一行置为当前行,第1列置为当前列;(6) else(7) 退栈回溯到上一行,移去该行已经放置的皇后,已该皇后所在列的下一列作为当前列;(8) }2. 1算法求精要对上述抽象算法进行逐步求精,就需要确定相应的存储结构和有关的数据类型。

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

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

八皇后问题一.八皇后问题简述:在8*8的国际象棋棋盘上放置8个皇后,使任意两个皇后不能互相攻击,即任何行任何列或对角线(与水平轴的夹角为45°或135°的斜线)上不得有两个或两个以上的皇后,这样的一个格局称为问题的一个解。

请求八皇后问题的算法。

二.解决思路:先声明我们根据条件可以知道皇后肯定是每行都有且只有一个所以我们创建一个数组x[t]让数组角标表示八皇后的行,用这个角标对应的数组值来确定这个皇后在这行的那一列。

我们用递归来做:这问题要求皇后所在的位置必须和其他皇后的位置不在同一行、列还有把两个皇后看成点其|斜率|=1;所以我们就要写这个限定条件用一个函数来实现:函数内对每一个已经放好的皇后的位置进行判断,所以就要有个循环。

我们既然是用递归来解决问题那就要把这个问题分成一个个相同的小问题来实现。

不难发现我们要在8*8的方格里放好8个皇后那我们就要知道在8(列)*7(行)是怎么放的在有我们事先写好的判断函数放好最后行就搞定了;以此类推我们要知道8*7的怎么方的我们就要知道8*6是怎么样的就好了,所以我们是以一行怎么放作为一个单元。

我们就去建一个可以放好一行的函数backtrack(int t)里面的t表示是第几行,在main函数调用的时候第一次传进来的是0也就是从第一行开始判断。

我们就开始写函数体了:每一行有8个位置可以放,每一个位置我们都要去判断一下所以我们就用循环来搞定。

在这个循环里面我们让x[t]=i也就是从这一行的第一个开始判断。

放好后就要去判断是否符合条件。

如果符合条件我们就在调用这个函数本身backtrack 不过传进去的参数是t+1也就是下一行的意思。

在进行判断下一行之前我们要判断一下t是不是等于8也就是已经是最后一行了,如果是最后一行了我们就可以将其进行输出。

打印8*8的矩阵(提示在写一个函数)皇后的位置用1表示出来没有的用0表示。

三.代码与注解:#include <math.h>#include <stdio.h>#include <time.h>#include<string.h>#include<conio.h> //用getch()要调用的头文件#include <stdlib.h> //要用system函数要调用的头文件int SUM=0; //统计有多少种可能int shezhi(){ //设置为N皇后问题int N;printf("这是一个N皇后问题...\n请输入N=");scanf("%d",&N);return N;}void Print(int N,int x[]) //印出結果{int MAX=N;for(int i=0;i<MAX;i++){for(int j=0;j<MAX;j++)if(j==x[i])printf("@");elseprintf("*");printf("\n");}SUM++; //打印一种情况统计一次printf("\n");}int Judge(int k,int x[]) //判断是否在同一直、橫、斜线上有其它棋子{int i;for(i=0;i<k;i++)if( abs(k-i)==abs(x[i]-x[k]) || x[i]==x[k] ) //函数名: abs; 功能: 求整数的绝对值 ;return 0;return 1;}void backtrack(int t,int N,int x[]) // 把棋子放到棋盘上{ int MAX=N;int i;for(i=0;i<MAX;i++){x[t]=i;if(Judge(t,x)){if(t==MAX-1){Print(MAX,x); // 找到其中一种放法,印出結果}else backtrack(t+1,N,x);}}}void Introduce(){printf("1.设置为N皇后问题。

八皇后问题

八皇后问题

一、八皇后问题设计程序完成如下要求:在8×8的国际象样棋盘上,放置8个皇后,使得这8个棋子不能互相被对方吃掉。

要求:1)依次输出各种成功的放置方法。

2)最好能画出棋盘的图形形式,并在其上动态地演示试探过程。

1、总思想:显然,棋盘的每一行可以且必须摆放一个皇后,可以用向量(x1,x2,……,xn)表示n皇后问题的解,即第i个皇后摆放在第i行第xi列的位置(1<=i<=n,且1<=xi<=n)。

由于两个皇后不能位于同一列,所以n皇后问题的解向量必须满足约束条件xi!=xj。

可以将n皇后问题的n*n棋盘看成是矩阵,设皇后i和皇后j的摆放位置分别是(i,xi)和(j,xj),则在棋盘上斜率为-1的同一条斜线上,满足条件i-xi=j-xj,在棋盘上斜率为1的同一条斜线上,满足条件i+xi=j+xj,综合上述两种情况,n皇后问题必须满足约束条件|i-j|!=|xi-xj|。

设函数Queue实现任意N皇后问题,皇后k摆放在第k行第x[k]列的位置。

算法的伪代码描述如下:算法:Queue(n)输入:皇后的个数n输出:n皇后问题的解x[n]初始化k=0 ,初始化解向量x[n]={-1} ;(1)重复执行下述操作,摆放皇后k ;①把皇后k摆放在下一列的位置,即x[k]++ ;②如果皇后k摆放在x[k]位置发生冲突,则x[k]++试探下一列,直到不冲突或者x[k]出界;③如果x[k]没出界且所有皇后都摆放完毕,则输出一个解;④如果x[k]没出界但尚有皇后没摆放,则k++,转(1)摆放下一个皇后;⑤如果x[k]出界,则回溯,x[k]=-1,k--,转(1)重新摆放皇后k。

注:本题只考虑八皇后问题。

2、代码:#include<stdio.h>#include<math.h>const int N = 8 ;int x[N] = {-1} ;int Place(int k){for(int i=0 ;i<k ;i++)if(x[i]==x[k]||abs(i-k) == abs(x[i]-x[k]))//违反约束条件return 1 ;return 0 ;}int main(){int k = 0,num = 0 ;while(k >= 0){x[k]++ ;while(x[k]<8 && Place(k) == 1)x[k]++ ;if(x[k]<8 && k == 7){printf("第%d个解是:",++num) ;for(int i =0 ;i<8 ;i++)printf("<%d,%d>\t",i+1,x[i]+1) ;printf("\n") ; }elseif(x[k]<8 && k<7)//上有皇后未摆放k = k+1 ;elsex[k--] = -1 ;//重置x[k],回溯,重新摆放皇后k }return 0 ; }结果:3、各模块功能说明:(1)Place:放置皇后的位置。

数据结构八皇后问题

数据结构八皇后问题

目录一需求分析 (1)1.1程序的功能: (1)1.2程序的输入输出要求: (1)二概要设计 (3)2.1程序的主要模块: (3)2.2程序涉及: (3)三详细设计 (3)3.1相关代码及算法 (4)3.1.1 定义相关的数据类型如下:....................... 错误!未定义书签。

3.1.2 主模块类C码算法: (4)3.1.3 画棋盘模块类C码算法 (5)3.1.4 画皇后模块类C码算法: (5)3.1.5 八皇后摆法模块(递归法): (6)3.1.6 初始化模块 (7)3.1.7 输出摆放好的八皇后图形(动态演示): (7)3.2相关流程图 (9)四调试分析 (12)五设计体会 (13)六附录 (13)七参考文献 (17)一需求分析1.1 程序功能:八皇后问题是一个古老而著名的问题。

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

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

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

本程序通过对子函数void qu(int i)的调用,将八皇后的问题关键通过数据结构的思想予以了实现。

虽然题目以及演算看起来都比较复杂,繁琐,但在实际中,只要当一只皇后放入棋盘后,在横与列、斜线上没有另外一只皇后与其冲突,再对皇后的定位进行相关的判断。

即可完成。

如果在这个程序中,我们运用的是非递归的思想,那么将大量使用if等语句,并通过不断的判断,去推出答案,而且这种非递归的思想,大大的增加了程序的时间复杂度。

如果我们使用了数据结构中的算法后,那么程序的时间复杂度,以及相关的代码简化都能取得不错的改进。

这个程序,我运用到了数据结构中的栈、数组,以及树和回溯的方法。

8皇后课程设计

8皇后课程设计

8皇后课程设计一、教学目标本课程的教学目标是使学生掌握“8皇后”问题的解法,培养学生的逻辑思维能力和问题解决能力。

知识目标包括理解“8皇后”问题的背景、算法原理和解决方案;技能目标则是使学生能够运用所学的算法解决实际问题,提高编程能力;情感态度价值观目标则是通过解决“8皇后”问题,培养学生独立思考、合作探究的学习态度,增强学生对计算机科学的兴趣。

二、教学内容本课程的教学内容主要包括“8皇后”问题的引入、算法原理和解决方案。

首先,通过讲解“8皇后”问题的背景,使学生了解其重要性;其次,讲解算法原理,使学生理解如何运用算法解决“8皇后”问题;最后,通过实践操作,使学生掌握具体的解决方案,提高编程能力。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法。

主要包括讲授法、案例分析法和实验法。

讲授法用于讲解“8皇后”问题的背景和算法原理;案例分析法用于分析具体的解决方案,使学生能够深入理解;实验法则用于让学生亲自动手实践,提高编程能力。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备适当的教学资源。

主要包括教材、参考书、多媒体资料和实验设备。

教材和参考书用于提供理论知识,帮助学生理解“8皇后”问题;多媒体资料则用于辅助讲解,使学生更加直观地理解问题;实验设备则是让学生能够亲自动手实践,提高编程能力。

五、教学评估本课程的评估方式将包括平时表现、作业和考试三个部分,以全面反映学生的学习成果。

平时表现评估将关注学生在课堂上的参与度、提问和回答问题的表现;作业评估将包括练习题和项目作业,检查学生对“8皇后”问题的理解和编程能力;考试则将综合测试学生对课程知识的掌握和应用能力。

评估方式将力求客观、公正,以激发学生的学习动力和自我提高。

六、教学安排本课程的教学安排将紧凑合理,确保在有限的时间内完成教学任务。

课程将安排在每周的固定时间,教学地点将选择适合进行编程实践的实验室或多媒体教室。

八皇后问题课程设计报告

八皇后问题课程设计报告

课程设计题目:名称:八皇后问题内容:设计程序完成如下要求:在8×8的国际象棋棋盘上,放置8个皇后,使得这8个棋子不能互相被对方吃掉。

要求:(1)依次输出各种成功的放置方法。

(2)最好能画出棋盘的图形形式,并在其上动态地标注行走的过程。

(3)程序能方便地移植到其他规格的棋盘上。

一、问题分析和任务定义八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。

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

在8!=40320种排列中共有92种解决方案。

本程序需要解决的问题有:1、建立合适的数据类型表示皇后在棋盘上所处的位置。

2、成功的输出全部正确的放置方法。

3、画出棋盘形式,在上面动态的标注其行走的过程。

二、数据结构的选择和概要设计1、为了简单易行的表示皇后在棋盘所处的位置,在此建立一个整型数组queen[i]来表示,若queen[3]=2则表示皇后处在8×8棋盘的第三行和第二列。

2、表示好皇后以后,设计judge( )和check( )函数来检测第一个皇后的同列和同斜线上有没有其他皇后(程序以行为基础,逐行试探每列和斜线上是否有皇后)。

然后设计输出函数show( )和print( )分别输出正确解法的排列形式和棋盘摆放形式。

在输出棋盘的步骤中,设计一个递归函数go( )实现棋盘的输出。

3、程序的流程图如下图所示:图1 程序流程图三、详细设计和编码1、首先定义整型数组queen[i]表示皇后的位置,i的取值由0到7表示八个皇后。

然后定义一个整型变量count来统计所有正确解法的个数。

2、因为每行只能摆放一个皇后,所以在皇后不在同一行的基础上,设计检测函数检测皇后的同列和同斜线上是否存在其他皇后。

约瑟夫环与八皇后问题--数据结构课程设计实验报告

约瑟夫环与八皇后问题--数据结构课程设计实验报告
目 一、 二、 三、 四、 五、 六、 七、
录 问题描述 1 问题分析 1 数据结构描述 算法设计 2 详细程序清单 程序运行结果 心得体会 12
1 4 11
一、 问题描述 1. 约瑟夫问题描述 编号为1,2... n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一 开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报 数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的 下一个开始重新从1报数,如此下去,直至所有人全部出列为止,设计一个程序求出出列 顺序。 2. 八皇后问题描述 在一个8×8的棋盘里放置8个皇后,要求每个皇后两两之间不相"冲"(在每一横 列竖列斜列只有一个皇后)。 3、界面设计模块问题描述 设计一个菜单式界面,让用户可以选择要解决的问题,同时可以退出程序。界面要 简洁明了,大方得体,便于用户的使用,同时,对于用户的错误选择可以进行有效的处 理。 二、 问题分析 在整个课程设计中,我主要负责的是约瑟夫问题中链表中的出列的操作算法的设计。 用循环单链表表示编号为1,2... n的n个人按顺时针方向围坐一圈,每人持有一个密码 (正整数)。一开始输入一个正整数作为报数的上限值turn,从第一个人开始按顺时针方 向自1开始顺序报数(即从第一个结点开始指针向后移动),报到turn-1时(即指针指向 turn-1个结点时)停止,他的下一位出列,将他的下一位密码作为新的turn值,从出列的 人的的顺时针方向上的下一个开始重新从1报数,如此下去,直至链表中只剩一位(即一 个结点)退出循环,并所有人的编号按出列顺序输出。在实现的过程中定义i表示报数的
int code; struct LNode *next; }node,*linklist; linklist creatstart(linklist L,int number) { int m,i; linklist s,p; s=L; for(i=1;i<=number;i++) { p=(linklist)malloc(sizeof(node)); if(!p) exit(0); p->data=i; printf("please input the code of number %d:",i); scanf("%d",&p->code); p->next=NULL; s->next=p; s=p; } s->next=L->next; return s; } void chulie(linklist L,int number) { int turn,i,j; linklist p,s; printf("please input the start code:"); scanf("%d",&turn); p=L; printf("the turn out of the circle is:"); for(i=1;i<=number-1;i++) { for(j=1;j<=turn-1;j++) p=p->next; printf("%d ",p->next->data); turn=p->next->code; s=p->next; p->next=s->next; free(s); } printf("%d ",p->next->data); printf("\n"); } void lianbiao() { int number; linklist L; L=(linklist)malloc(sizeof(node));

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

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

数据结构课程设计报告八皇后问题设计任务书课题名称八皇后设计目的1.调研并熟悉八皇后的基本功能、数据流程与工作规程;2.学习八皇后相关的算法和基于VC++集成环境的编程技术;3.通过实际编程加深对基础知识的理解,提高实践能力;4.学习开发资料的收集与整理,学会撰写课程设计报告。

实验环境1.微型电子计算机(PC);2.安装Windows 2000以上操作系统,Visual C++6.0开发工具。

任务要求1.利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;2.在第16周末之前完成预设计,并请指导教师审查,通过后方可进行下一步工作;3.本课题要求至少用三种方法解决八皇后问题,输入棋盘的阶层,然后显示共有多少种布局方案,并显示每一种方案的具体情况。

4.结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、结论正确,正文字数不少于3000字(不含代码)。

工作进度计划序号起止日期工作内容1 2009.06.7~2009.06.7 在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。

22009.06.7~2009.06.10设计总体方案,构建、绘制流程框图,编写代码,上机调试。

3 2009.06.11~2009.06.12测试程序,优化代码,增强功能,撰写设计报告。

4 2009.06.12~2009.06.13提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。

指导教师(签章):2013 年 5 月 15 日摘要:众所周知的八皇后问题是一个非常古老的问题,具体如下:在8*8的国际象棋棋盘上放置了八个皇后,要求没有一个皇后能吃掉另一个皇后,即任意两个皇后都不处于棋盘的同一行、同一列或同一对角线上,这是做出这个课题的基础。

要求编写实现八皇后问题的递归解法或非递归解法,对于任意给定的一个初始位置,输出八皇后问题的一个布局。

本次设计旨在学习各种算法,训练对基础知识和基本方法的综合运用及变通能力,增强对算法的理解能力,提高软件设计能力。

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

课程设计报告课程名称数据结构课程设计课题名称八皇后问题演示专业通信工程班级通信工程1081学号************姓名刘献文指导教师田娟秀郭芳2012年7 月 6 日湖南工程学院课程设计任务书课程名称数据结构课题八皇后问题演示专业班级通信工程1081学生姓名刘献文学号************指导老师田娟秀郭芳审批任务书下达日期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.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样的结构,它们之间有什么关系等。

(3)详细设计a.采用C语言定义相关的数据类型。

b.写出各模块的类C码算法。

c.画出各函数的调用关系图、主要函数的流程图。

(4)调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。

b.程序调试中遇到的问题以及解决问题的方法。

c.课程设计过程经验教训、心得体会。

(5)使用说明用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。

(6)书写格式a.设计报告要求用A4纸打印成册:b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

(7)附录源程序清单(带注释)1.3.2 考核方式指导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。

具体考核标准包含以下几个部分:(1)平时出勤(占10%)(2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)(3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)(4)设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。

(5)独立完成情况(占10%)。

1.3.3 课程验收要求(1)运行所设计的系统。

(2)回答有关问题。

(3)提交课程设计报告。

(4)提交软盘(源程序、设计报告文档)。

(5)依内容的创新程度,完善程序情况及对程序讲解情况打分。

2 进度安排第 20 周:星期一 8:00——12:00 上课星期二 8:00——12:00 上机星期三 14:30——18:30 上机星期四 8:00——12:00 上机附:课程设计报告装订顺序:封面、任务书、目录、正文、评分表、附件(A4大小的图纸及程序清单)。

正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。

正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,要求对程序写出必要的注释)。

正文总字数要求在5000字以上(不含程序原代码)。

目录一、需求分析 ......................................................... (7)1.1 功能要求 (7)1.2涉及到的知识点 (7)二、概要设计 (7)2.1 数据结构 (7)2.2 抽象数据类型的定义 (8)2.3 算法流程 (8)三、详细设计 (9)四、调试分析及测试 (13)4.1遇到的问题及解决方法 (13)4.2程序使用说明 (13)4.3 测试结果 (13)五、总结与体会 (16)六、评分表 (17)七、附录(源程序) (18)一、需求分析八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850年提出的,并作了部分解答。

高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有76种不同的放法,这就是有名的“八皇后”问题。

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

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

现在我们已经知道八皇后问题有92个解答。

1.1 功能要求当运行程序时,在屏幕上显示一个比较直观选择界面。

进入界面后,就会提示输入字符的输入形式,在八皇后求解程序中,只要你选择输出解的格式,选择1则显示为每一列皇后的放置的行数,选择2则显示的是以矩阵形式形象的显示皇后的放置位置,选择0则退出程序的调试。

在调试结果中,■的位置也就表示了该皇后应该所在的位置,□代表了空位置。

1.2涉及到的知识点本次课程设计中,用到的主要知识有:递归法的应用,for语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的掌握.二、概要设计2.1 数据结构. 1.数组gEightQueen[],存放第i行皇后所在的列;2.cont为存放皇后问题解的个数,ment为皇后问题解矩形形式显示的解的个数;3. 对角线标记为q[j]-i与(j-k),i为列,j为行,当(q[j]==i)或者(abs(q[j]-i)==abs(j-k)),则表示第i列皇后是否已在第j行存在或q[j]-i与(j-k)为对角线冲突;2.2 抽象数据类型的定义print1() //打印每一行皇后放置的列数的情况print2()//打印以矩阵形式形象的显示皇后的放置位置find()//寻找可以放置皇后的位置place1() 、place2()//递归调用,存入所有每一行皇后所在的列Sleep(i)//缓冲i/1000s显示下一个矩阵形式皇后位置void main() //主函数调用2.3 算法流程1. 当n<=8时,从n行开始摆放第n个皇后(因为这样便可以符合每一行一个皇后的要求)把第n个皇后所在的列存入q[k]中,递归调用,存入第n行皇后所在的列,直到8个皇后都已放置,2. 当n>8时,便打印出结果。

算法流程图如下三、详细设计//位置标明法打印void print1(int n){int i;cont++;printf("第%d个解:",cont);for(i=1;i<=n;i++)printf("%d",q[i]);printf("\n");}//矩阵表示法打印void print2() //输出一个解{ment++; //输出的解的个数int i=0;printf("第%d个解:\n",ment);Sleep(300);for(i=1;i<9;i++) //i为行{for( int d=1;d<9;d++) //d为列{if(d==q[i]) //如果此行中d为存入皇后的列 printf("■"); //标记输出elseprintf("□"); //此行中其他列输出}printf("\n"); //一行输出完成,换行}}//递归调用法摆放所有皇后情况void place1(int k){if(k>8)print1(8);elsefor(int i=1;i<=8;i++)if(find(i,k)){q[k]=i; //把第K个皇后所在的列存入q[k]中place1(k+1); //递归调用,存入第k+1个皇后所在的列,直到8个皇后都已放置}}void place2(int k){if(k>8)print2();elsefor(int i=1;i<=8;i++)if(find(i,k)){q[k]=i;place2(k+1);}}//主函数调用void main(){int choice;char ch;printf("\n\n\t** 欢迎进入八皇后问题 **\n\n");ch='y';while(ch=='y'||ch=='Y'){printf("\n\t 查询菜单\n");printf("\n\t******************************************************"); printf("\n\t* No.1--------每一行皇后放置的列数的情况 *"); printf("\n\t* No.2--------视图矩阵形式显示皇后的位置 *"); printf("\n\t* No.0--------退出 *"); printf("\n\t******************************************************"); printf("\n\t请选择菜单号(No.0--No.2): ");scanf("%d",&choice);switch(choice){case 1:printf("\n\t每一行皇后放置的列数的情况\n\n");place1(1); //从第1个皇后开始放置break;case 2:place2(1); //从第1个皇后开始放置break;case 0:ch='n';break;default:printf("\n\t\t菜单选择错误,请重新输入!\n");}}}各函数的调用关系图、主要函数的流程图四、调试分析及测试4.1遇到的问题及解决方法(1).由于对八个皇后放置的位置不能一次确定,而且前一个皇后的放置位置直接影响着后面的放置位置,使程序调试时要花费不少时间。

相关文档
最新文档