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

合集下载

八皇后问题 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()
  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).由于对八个皇后放置的位置不能一次确定,而且前一个皇后的放置位置直接影响着后面的放置位置,使程序调试时要花费不少时间。

相关文档
最新文档