数据结构课程设计之八皇后问题.docx
- 文档编号:27991683
- 上传时间:2023-07-07
- 格式:DOCX
- 页数:14
- 大小:172.88KB
数据结构课程设计之八皇后问题.docx
《数据结构课程设计之八皇后问题.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之八皇后问题.docx(14页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之八皇后问题
课程设计报告
课程名称数据结构课程设计
课题名称八皇后问题演示
专业通信工程
班级通信工程1081
学号0103
姓名刘献文
指导教师田娟秀郭芳
2012年7月6日
湖南工程学院
课程设计任务书
课程名称数据结构
课题八皇后问题演示
专业班级通信工程1081
学生姓名刘献文
学号0103
指导老师田娟秀郭芳
审批
任务书下达日期2012年7月1日
任务完成日期2012年7月6日
1设计内容与设计要求
设计内容
(4)课题四:
八皇后问题演示
八皇后问题是一个古老而着名的问题,是回溯算法的典型例题。
该问题是十九世纪着名的数学家高斯1850年提出:
在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。
1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
设计思路:
?
解决8皇后时,在安放第i行皇后时,需要在列的方向从1到n试探(j=1,…,n):
首先在第j列安放一个皇后,如果在列、主对角线、次对角线方向有其它皇后,则出现攻击,撤消在第j列安放的皇后。
如果没有出现攻击,在第j列安放的皇后不动,递归安放第i+1行皇后。
对于八皇后问题的实现,如果结合动态的图形演示,则可以使算法的描述更形象、更生动。
要求用TurboC或MFC实现的八皇后问题的图形程序,能够演示全部的92组解。
选题方案:
所选题目根据学号确定,学号模6加1,即(学号%6+1)。
如你的学号为9,则所选题目号为:
9%6+1=(题目4)。
注意,所有的课题都要求用图形方式演示步骤和结果。
同学们可以自己针对数据结构课程中所讲算法来设计一个演示过程的算法。
设计要求:
课程设计报告规范
(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)平时出勤(占10%)
(2)系统需求分析、功能设计、数据结构设计及程序总体结构合理与否(占10%)
(3)程序能否完整、准确地运行,个人能否独立、熟练地调试程序(占40%)
(4)设计报告(占30%)
注意:
不得抄袭他人的报告(或给他人抄袭),一旦发现,成绩为零分。
(5)独立完成情况(占10%)。
课程验收要求
(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
功能要求7
涉及到的知识点7
二、概要设计7
数据结构7
抽象数据类型的定义8
算法流程8
三、详细设计9
四、调试分析及测试13
遇到的问题及解决方法13
程序使用说明13
测试结果13
五、总结与体会16
六、评分表17
七、附录(源程序)18
一、需求分析
八皇后问题是一个古老而着名的问题,该问题是十九世纪着名的数学家高斯1850年提出的,并作了部分解答。
高斯在棋盘上放下了八个互不攻击的皇后,他还认为可能有76种不同的放法,这就是有名的“八皇后”问题。
在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。
所以高斯提出了一个问题:
在8*8的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。
现在我们已经知道八皇后问题有92个解答。
功能要求
当运行程序时,在屏幕上显示一个比较直观选择界面。
进入界面后,就会提示输入字符的输入形式,在八皇后求解程序中,只要你选择输出解的格式,选择1则显示为每一列皇后的放置的行数,选择2则显示的是以矩阵形式形象的显示皇后的放置位置,选择0则退出程序的调试。
在调试结果中,■的位置也就表示了该皇后应该所在的位置,□代表了空位置。
涉及到的知识点
本次课程设计中,用到的主要知识有:
递归法的应用,for语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的掌握.
二、概要设计
数据结构
.1.数组gEightQueen[],存放第i行皇后所在的列;
为存放皇后问题解的个数,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)为对角线冲突;
抽象数据类型的定义
print1()当n<=8时,从n行开始摆放第n个皇后(因为这样便可以符合每一行一个皇后的要求)把第n个皇后所在的列存入q[k]中,递归调用,存入第n行皇后所在的列,直到8个皇后都已放置,
2.当n>8时,便打印出结果。
算法流程图如下:
Y
N
N
三、详细设计
也是在这次课程设计中我所掌握得到的。
但在这次的课设中也遇了一些问题,如,八皇后在变成初期由于没真正体会到“树”在里面的运用,不自觉的采用了非递归的算法,结果大大增加了程序的复杂程度。
并且也让整个程序的时间复杂度变得更大;在重温了树的回溯,以及二叉树的遍历后,最终将程序进行了一次较大的改造。
并且通过思考,再将以前的知识加以运用才最终解决了这个问题,整个程序的算法的可看性也有了较大的改进。
总结一下自己,发现自己虽然在不仅在理论上没有掌握牢固,并且在实践的时候也遇到了问题,所以自己还是远远的不足,不管是在数据结构课程的设计上,还是其他专业课上,在以后的一段学习时间里必须坚持自己思考,自己多动脑,多动手,这样才能脱离理论,让自己的学习更上一层楼。
参考文献
[1].数据结构教程/李春葆等编着.—3版—北京:
清华大学出版社,
[2].数据结构教程(第三版)上机实验教程/李春葆等编着.—北京:
清华大学出版社,
四、评分表
应用技术学院课程设计评分表
课程名称:
数据结构课程设计
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
(注:
1.此页附在课程设计报告之后;2.综合成绩按优、良、中、及格和不及格五级评定。
)
五、附录(源程序)
#include<>
#include<>
#include<>
constintN=20;
intq[N];
intcont=0,ment=0;
voidprint1(intn)
{
inti;
cont++;
printf("第%d个解:
",cont);
for(i=1;i<=n;i++)
printf("%d",q[i]);
printf("\n");
}
voidprint2()//输出一个解
{
ment++;//输出的解的个数
inti=0;
printf("第%d个解:
\n",ment);
Sleep(300);
for(i=1;i<9;i++)//i为行
{
for(intd=1;d<9;d++)//d为列
{if(d==q[i])//如果此行中d为存入皇后的列
printf("■");//标记输出
else
printf("□");//此行中其他列输出
}
printf("\n");//一行输出完成,换行
}
}
intfind(inti,intk)
{
intj;//定义j为行
j=1;
while(j { if((q[j]==i)||(abs(q[j]-i)==abs(j-k)))//判断第i列皇后是否已在第j行存在 或q[j]-i与(j-k)为对角线冲突 return0;//说明第i列第j行不能放皇后 j++; } return1; } voidplace1(intk) { if(k>8) print1(8); else for(inti=1;i<=8;i++) if(find(i,k)) { q[k]=i;//把第K个皇后所在的列存入q[k]中 place1(k+1);//递归调用,存入第k+1个皇后所在的列, 直到8个皇后都已放置 } } voidplace2(intk) { if(k>8) print2(); else for(inti=1;i<=8;i++) if(find(i,k)) { q[k]=i; place2(k+1); } } voidmain() { intchoice; charch; printf("\n\n\t**欢迎进入八皇后问题**\n\n"); ch='y'; while(ch=='y'||ch=='Y') { printf("\n\t查询菜单\n"); printf("\n\t******************************************************"); printf("\n\t*每一行皇后放置的列数的情况*"); printf("\n\t*视图矩阵形式显示皇后的位置*"); printf("\n\t*退出*"); printf("\n\t******************************************************"); printf("\n\t请选择菜单号: "); scanf("%d",&choice); switch(choice) { case1: printf("\n\t每一行皇后放置的列数的情况\n\n"); place1 (1);//从第1个皇后开始放置 break; case2: place2 (1);//从第1个皇后开始放置 break; case0: ch='n'; break; default: printf("\n\t\t菜单选择错误,请重新输入! \n"); } } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 皇后 问题
![提示](https://static.bdocx.com/images/bang_tan.gif)