1、数据结构课程设计之八皇后问题课 程 设 计 报 告课程名称 数据结构课程设计 课题名称 八皇后问题演示 专 业 通信工程 班 级 通信工程1081 学 号 0103 姓 名 刘献文 指导教师 田娟秀 郭芳 2012年 7 月 6 日湖南工程学院课 程 设 计 任 务 书课程名称 数据结构 课 题 八皇后问题演示 专业班级 通信工程1081 学生姓名 刘献文 学 号 0103 指导老师 田娟秀 郭芳 审 批 任务书下达日期 2012 年 7 月 1 日任务完成日期 2012 年 7 月 6 日1设计内容与设计要求设计内容(4)课题四:八皇后问题演示八皇后问题是一个古老而着名的问题,是回溯算法的典
2、型例题。该问题是十九世纪着名的数学家高斯1850年提出:在88格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。设计思路:?解决8皇后时,在安放第i行皇后时,需要在列的方向从1到n试探(j =1, n):首先在第j列安放一个皇后,如果在列、主对角线、次对角线方向有其它皇后,则出现攻击,撤消在第j列安放的皇后。如果没有出现攻击,在第j列安放的皇后不动,递归安放第i+1行皇后。 对于八皇后问题的实现,如果结合动态的图形
3、演示,则可以使算法的描述更形象、更生动。要求用Turbo C或 MFC实现的八皇后问题的图形程序,能够演示全部的92组解。 选题方案:所选题目根据学号确定,学号模6加1,即(学号%6+1)。如你的学号为9,则所选题目号为:9%6+1(题目4)。注意,所有的课题都要求用图形方式演示步骤和结果。同学们可以自己针对数据结构课程中所讲算法来设计一个演示过程的算法。设计要求: 课程设计报告规范(1)需求分析a.程序的功能。b.输入输出的要求。(2)概要设计a.程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。b.课题涉及的数据结构和数据库结构;即要存储什么数据,这些数据是什么样
4、的结构,它们之间有什么关系等。(3)详细设计a.采用C语言定义相关的数据类型。b写出各模块的类C码算法。c.画出各函数的调用关系图、主要函数的流程图。(4)调试分析以及设计体会a.测试数据:准备典型的测试数据和测试方案,包括正确的输入及输出结果和含有错误的输入及输出结果。b.程序调试中遇到的问题以及解决问题的方法。c.课程设计过程经验教训、心得体会。(5)使用说明用户使用手册:说明如何使用你编写的程序,详细列出每一步的操作步骤。(6)书写格式a.设计报告要求用A4纸打印成册:b.一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。(7)附录源程序清单(带注释) 考核方式指
5、导老师负责验收程序的运行结果,并结合学生的工作态度、实际动手能力、创新精神和设计报告等进行综合考评,并按优秀、良好、中等、及格和不及格五个等级给出每位同学的课程设计成绩。具体考核标准包含以下几个部分:(1)平时出勤 (占10%)(2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)(3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)(4)设计报告(占30%)注意:不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。(5)独立完成情况(占10%)。 课程验收要求(1)运行所设计的系统。(2)回答有关问题。(3)提交课程设计报告。(4)提交软盘(源程
6、序、设计报告文档)。(5)依内容的创新程度,完善程序情况及对程序讲解情况打分。2 进度安排第 20 周:星期一 8:0012:00 上课 星期二 8:0012:00 上机 星期三 14:3018:30 上机星期四 8:0012:00 上机附:课程设计报告装订顺序:封面、任务书、目录、正文、评分表、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的原代码,
7、要求对程序写出必要的注释)。正文总字数要求在5000字以上(不含程序原代码)。一、 需求分析 .7 功能要求 7涉及到的知识点 7二、 概要设计 7 数据结构 7 抽象数据类型的定义 8 算法流程 8三、 详细设计 9四、 调试分析及测试 13遇到的问题及解决方法 13程序使用说明 13 测试结果 13五、 总结与体会 16六、 评分表 17七、 附录(源程序) 18一、需求分析八皇后问题是一个古老而着名的问题,该问题是十九世纪着名的数学家高斯1850年提出的,并作了部分解答。高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有76种不同的放法,这就是有名的“八皇后”问题。在国际象棋中,皇后是
8、最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。现在我们已经知道八皇后问题有92个解答。 功能要求当运行程序时,在屏幕上显示一个比较直观选择界面。进入界面后,就会提示输入字符的输入形式,在八皇后求解程序中,只要你选择输出解的格式,选择1则显示为每一列皇后的放置的行数,选择2则显示的是以矩阵形式形象的显示皇后的放置位置,选择0则退出程序的调试。在调试结果中,的位置也就表示了该皇后应该
9、所在的位置,代表了空位置。涉及到的知识点本次课程设计中,用到的主要知识有:递归法的应用,for语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的掌握.二、概要设计 数据结构. 1.数组gEightQueen,存放第i行皇后所在的列;为存放皇后问题解的个数 ,ment为皇后问题解矩形形式显示的解的个数;3. 对角线标记为qj-i与(j-k),i为列,j为行,当(qj=i)或者(abs(qj-i)=abs(j-k),则表示第i列皇后是否已在第j行存在或qj-i与(j-k)为对角线冲突; 抽象数据类型的定义print1() 当n8时,便打印出结果。算法流程图如下: Y N N三、详细设计也是在这
10、次课程设计中我所掌握得到的。 但在这次的课设中也遇了一些问题,如,八皇后在变成初期由于没真正体会到“树”在里面的运用,不自觉的采用了非递归的算法,结果大大增加了程序的复杂程度。并且也让整个程序的时间复杂度变得更大;在重温了树的回溯,以及二叉树的遍历后,最终将程序进行了一次较大的改造。并且通过思考,再将以前的知识加以运用才最终解决了这个问题,整个程序的算法的可看性也有了较大的改进。 总结一下自己,发现自己虽然在不仅在理论上没有掌握牢固,并且在实践的时候也遇到了问题,所以自己还是远远的不足,不管是在数据结构课程的设计上,还是其他专业课上,在以后的一段学习时间里必须坚持自己思考,自己多动脑,多动手,
11、这样才能脱离理论,让自己的学习更上一层楼。参考文献1.数据结构教程/李春葆等编着.3版北京:清华大学出版社, 2.数据结构教程(第三版)上机实验教程/李春葆等编着.北京:清华大学出版社, 四、评分表应用技术学院课程设计评分表课程名称: 数据结构课程设计 项 目评 价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩 教师签名: 日 期: (注:1此页附在课程设计报告之后;2综合成绩按优、良、中、及格和不及格五级评定。)五、附录(源程序)#include#include #include const int N=20; int qN; int
12、cont=0,ment=0; void print1(int n) int i; cont+; printf(第%d个解:,cont); for(i=1;i=n;i+) printf(%d,qi); printf(n);void print2() /输出一个解 ment+; /输出的解的个数 int i=0; printf(第%d个解:n,ment); Sleep(300); for(i=1;i9;i+) /i为行 for( int d=1;d9;d+) /d为列 if(d=qi) /如果此行中d为存入皇后的列 printf(); /标记输出 else printf(); /此行中其他列输出
13、printf(n); /一行输出完成,换行 int find(int i,int k) int j; /定义j为行 j=1; while(j8) print1(8); else for(int i=1;i8) print2(); else for(int i=1;i=8;i+) if(find(i,k) qk=i; place2(k+1); void main() int choice; char ch; printf(nnt* 欢迎进入八皇后问题 *nn); ch=y; while(ch=y|ch=Y) printf(nt 查 询 菜 单n); printf(nt*); printf(nt* 每一行皇后放置的列数的情况 *); printf(nt* 视图矩阵形式显示皇后的位置 *); printf(nt* 退 出 *); printf(nt*); printf(nt请选择菜单号: ); scanf(%d,&choice); switch(choice) case 1: printf(nt每一行皇后放置的列数的情况nn); place1(1); /从第1个皇后开始放置 break; case 2: place2(1); /从第1个皇后开始放置 break; case 0: ch=n; break; default: printf(ntt菜单选择错误,请重新输入!n);