ImageVerifierCode 换一换
格式:DOCX , 页数:30 ,大小:247.88KB ,
资源ID:30521614      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30521614.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(八皇后问题数据结构课程设计报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

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

1、八皇后问题数据结构课程设计报告数据结构课程设计报告八皇后问题设计任务书课题名称八皇后设计目的1.调研并熟悉八皇后的基本功能、数据流程与工作规程;2.学习八皇后相关的算法和基于VC+集成环境的编程技术;3.通过实际编程加深对基础知识的理解,提高实践能力;4.学习开发资料的收集与整理,学会撰写课程设计报告。实验环境1.微型电子计算机(PC);2.安装Windows 2000以上操作系统,Visual C+6.0开发工具。任务要求1.利用课余时间去图书馆或上网查阅课题相关资料,深入理解课题含义及设计要求,注意材料收集与整理;2.在第16周末之前完成预设计,并请指导教师审查,通过后方可进行下一步工作;

2、3.本课题要求至少用三种方法解决八皇后问题,输入棋盘的阶层,然后显示共有多少种布局方案,并显示每一种方案的具体情况。4.结束后,及时提交设计报告(含纸质稿、电子稿),要求格式规范、内容完整、结论正确,正文字数不少于3000字(不含代码)。工作进度计划序号起止日期工 作 内 容12009.06.72009.06.7在预设计的基础上,进一步查阅资料,完善设计方案,形成书面材料。22009.06. 72009.06.10设计总体方案,构建、绘制流程框图,编写代码,上机调试。32009.06.112009.06.12测试程序,优化代码,增强功能,撰写设计报告。42009.06.122009.06.13

3、提交软件代码、设计报告,参加答辩,根据教师反馈意见,修改、完善设计报告。指导教师(签章): 年 月 日 摘要: 众所周知的八皇后问题是一个非常古老的问题,具体如下:在8*8的国际象棋棋盘上放置了八个皇后,要求没有一个皇后能吃掉另一个皇后,即任意两个皇后都不处于棋盘的同一行、同一列或同一对角线上,这是做出这个课题的基础。要求编写实现八皇后问题的递归解法或非递归解法,对于任意给定的一个初始位置,输出八皇后问题的一个布局。本次设计旨在学习各种算法,训练对基础知识和基本方法的综合运用及变通能力,增强对算法的理解能力,提高软件设计能力。在实践中培养独立分析问题和解决问题的作风和能力。 要求熟练运用C+语

4、言、基本算法的基础知识,独立编制一个具有中等难度的、解决实际应用问题的应用程序。通过对题意的分析与计算,用递归法回溯法及枚举法解决八皇后是比较适合的。递归是一种比较简单的且比较古老的算法。回溯法是递归法的升华,在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而枚举法,更是一种基础易懂简洁的方法。把它们综合起来,就构成了今天的算法。不论用什么法做这个课题,重要的就是先搞清楚哪个位置是合法的放皇后的位置,哪个不能,要先判断,后放置。关键词:八皇后;递归法;回溯法;数组;枚举法. 1 课题综述1.1 八皇后问题概述八皇后问题是一个古老而著名的问题。该问题是十九世纪著名的数学

5、家高斯1850提出;在88格的国际象棋上摆放八皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后人有人用图论的方法解出92宗结果。虽然问题的关键在于如何判定某个皇后所在的行、列、斜线是否有别的皇后;可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列号相同;如果同在“/”斜线上的行列值之和相同;如果在对角线上,则行列号之和或之差相等,逐个纪录符合题意的情况,最终得出解。(如图1-1,是八皇后问题的一个实例图) 图1-1八皇后棋盘实例1.2 预期目标

6、运用C+程序设计的编程思想编写代码,实现八皇后问题的所有(92种)摆放情况。要求在DOS界面上显示出每一种方式。1.3 八皇后问题课题要求编写代码,用至少三种方法解决八皇后问题。运行程序后,显现下面的参考界面:八皇后问题=1方法一2方法二3方法三请选择(1、2或3,0:退出):图1-2输出界面实例选择一个菜单后,要求输入棋盘的阶层,即N。输入后,显示共有多少种布局方案,并显示每一种方案的具体情况,如下图:77: (0,2) (1,0) (2,6) (3,4) (4,7) (5,1) (6,3) (7,5)78: (0,7) (1,1) (2,4) (3,2) (4,0) (5,6) (6,3)

7、 (7,5)图1-3输出样式实例1.4 面对的问题需要用三种方法解决八皇后问题,在这里需要查阅大量资料并多加练习,才能成功编写程序。主要要解决下面的问题:冲突:包括列、行、两条对角线;1.列:规定每一列放一个皇后,就不会造成列上的冲突;2.行:当第i行被某个皇后占据时,该行所有空格就都不能放置其他皇后;3.对角线:对角线有两个方向,在同一对角线上的所有点都不能有冲突。2 需求分析2.1 涉及到的知识基础在本次的课程设计中,用到的知识点主要有:类、函数、选择结构里的条件语句、循环结构里的while语句以及for循环语句、控制语句里的break语句、以及字符串函数的运用等等,并且应用到递归、回溯及

8、穷举等比较经典的算法。2.1.1 类2.1.1.1 类定义类就是用户自定义的数据类型。类定义的一般形式如下: class 类名 细节;(数据成员,成员函数);2.1.1.2 类函数定义类成员函数类的成员函数通常在类外定义,一般形式如下: 返回类型 类名:函数名(形参表) 函数体;双冒号: :是域运算符,主要用于类的成员函数的定义。2.1.2 函数2.1.2.1 函数的定义定义函数需要指明:函数执行结果返回值的类型、函数名、形式参数(简称形参)和函数体。一般形式为: 数据类型 函数名(行参表) 语句序列;Return 合适类型数值2.1.2.2 2.1.2.3 函数调用调用一个函数之前必须对该函

9、数进行说明。函数调用由函数名和函数调用运算符( )组成,( )内有0个或多个逗号分隔的参数(称为实参)。每一个参数是一个表达式,且参数的个数与参数的类型要与被调函数定义的参数(称为形参)个数和类型匹配。当被调函数执行时,首先计算实参表达式,并将结果值传送给行参,然后执行函数体,返回的返回值被传送到调用函数。如果函数调用后有返回值,调用表达是可以用在表达式中,而无参函数的调用是一个单独的语句。2.1.3 选择结构2.1.3.1 用if语句实现选择结构设计if语句的基本形式可分为两种:(1) if (表达式) 语句其执行过程是,首先计算表达式的值,若不为0,条件判断为真,则执行( )后面的语句,否

10、则,if语句中止执行,即不执行( )后面的语句。(2) if(表达式) 语句1 else 语句2其执行过程是,首先计算表达式的值,若不为0,条件判断为真,则执行( )后面的语句,否则执行语句2。2.1.3.2 if语句嵌套if语句中的任何一个子句可以是任意可执行语句,当然也可以是一条if语句,这种情况称为if语句嵌套。当出现if语句的嵌套时,不管书写格式如何,else格式都将与它前面最靠近的未曾配对的if语句相配对,构成一条完整的if语句。它的格式为:if(表达式1) 语句1;else if (表达式2) 语句2; else if (表达式n) 语句n; else 语句n1;2.1.3.3 w

11、hile和do-while语句while语句用来实现“当型”循环结构,即先判断表达式,然后判断循环条件是否成立。其一般形式为:do语句;/循环体while(条件表达式); 其中要注意的是while后面的括号理是表达式而不是语句,表达式是没有分号的;而do-while中最后结束时要有分号。2.1.4 循环结构2.1.4.1 for语句这种循环语句不仅用于循环次数已知的情况,还能用于循环次数预先不能确定只给出循环结束条件的情况下。for 语句的一般形式:for (表达式1;表达式2;表达式3) 语句;/循环体其执行的过程有以下几个步骤:求解表达式1;求解表达式2,若其值为真,则执行for语句中指定

12、的循环体语句,然后执行下面的第3)步。若为假,则结束循环;求解表达式3;转回上面第2)步继续执行;循环结束,执行for语句后面的其他语句。2.1.4.2 Break语句该语句被限定使用在任一种循环语句和switch语句中,但break语句仅仅退出包含该break语句的那层循环,即break语句不能使程序控制退出一层以上的循环。2.1.5 字符串处理函数字符比较函数strcmp格式:strcmp(字符串1,字符串2)它的功能是,比较字符串1和字符串2。如果字符串1小于字符串2,该函数返回一个负整数值;如果字符串1等于字符串2,该函数返回0;如果字符串1大于字符串2,该函数返回一个正整数值。2.2

13、 总体方案 显然问题的键在于如何判定某个皇后所在的行、列、斜线上是否有别的皇后;可以从矩阵的特点上找到规律,如果在同一行,则行号相同;如果在同一列上,则列号相同;如果同在斜线上的行列值之和相同;如果同在/斜线上的行列值之差相同;如果斜线不分方向,则同一斜线上两皇后的行号之差的绝对值与列号之差的绝对值相同。下图是一个范例(图2-1是八皇后排列方式在vs6.0中的结果显示,图2-2是棋盘中八皇后位置显示)将把皇后问题用三种方法表示出来,三种方法用switch语句连接. 图 2-1 “1”作为皇后 图2-2 棋盘中的八皇后位置显示 3 模块及算法设计3.1 算法描述3.1.1 递归法递归是指函数/过

14、程/子程序在运行过程序中直接或间接调用自身而产生的重入现像. 递归算法一般用于解决三类问题:(1)数据的定义是按递归定义的。(Fibonacci函数)(2)问题解法按递归算法实现。(回溯)(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。 3.1.2 回溯法回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。按选优条件向前搜索,以达到目

15、标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。可用回溯法求解的问题P,通常要能表达为:对于已知的由n元组(x1,x2,xn)组成的一个状态空间E=(x1,x2,xn)|xiSi ,i=1,2,n,给定关于n元组中的一个分量的一个约束集D,要求E中满足D的全部约束条件的所有n元组。其中Si是分量xi的定义域,且 |Si| 有限,i=1,2,n。我们称E中满足D的全部约束条件的任一n元组为问题P的一个解。回溯法首先将问题P的n元组的状态空间E表示成一棵高为n的带权有序树T,把在E中求问题P

16、的所有解转化为在T中搜索问题P的所有解。树T类似于检索树,它可以这样构造: 设Si中的元素可排成xi(1) ,xi(2) ,xi(mi-1) ,|Si| =mi,i=1,2,n。从根开始,让T的第I层的每一个结点都有mi个儿子。这mi个儿子到它们的双亲的边,按从左到右的次序,分别带权xi+1(1) ,xi+1(2) ,xi+1(mi) ,i=0,1,2,n-1。照这种构造方式,E中的一个n元组(x1,x2,xn)对应于T中的一个叶子结点,T的根到这个叶子结点的路径上依次的n条边的权分别为x1,x2,xn,反之亦然。另外,对于任意的0in-1,E中n元组(x1,x2,xn)的一个前缀I元组(x1

17、,x2,xi)对应于T中的一个非叶子结点,T的根到这个非叶子结点的路径上依次的I条边的权分别为x1,x2,xi,反之亦然。特别,E中的任意一个n元组的空前缀( ),对应于T的根。因而,在E中寻找问题P的一个解等价于在T中搜索一个叶子结点,要求从T的根到该叶子结点的路径上依次的n条边相应带的n个权x1,x2,xn满足约束集D的全部约束。在T中搜索所要求的叶子结点,很自然的一种方式是从根出发,按深度优先的策略逐步深入,即依次搜索满足约束条件的前缀1元组(x1i)、前缀2元组(x1,x2)、,前缀I元组(x1,x2,xi),直到i=n为止。在回溯法中,上述引入的树被称为问题P的状态空间树;树T上任意

18、一个结点被称为问题P的状态结点;树T上的任意一个叶子结点被称为问题P的一个解状态结点;树T上满足约束集D的全部约束的任意一个叶子结点被称为问题P的一个回答状态结点,它对应于问题P的一个解。3.1.3 穷举法顾名思义,穷举法就是通过把需要解决问题的所有可能情况逐一试验来找出符合条件的解的方法,对于许多毫无规律的问题而言,穷举法用时间上的牺牲换来了解的全面性保证,尤其是随着计算机运算速度的飞速发展,穷举法的形象已经不再是最低等和原始的无奈之举,比如经常有黑客在几乎没有任何已知信息的情况下利用穷举法来破译密码,足见这种方法还是有其适用的领域的。可是,在实际生活中,只有很少的一些问题是真正意义上的“毫

19、无规律”,其余的大多数仍有内在规律可循,对于这些问题,使用穷举法在效率上就显得比较低下,而在一些对速度要求较高的区域和规模较大的问题上,效率的低下往往是致命的。3.2详细流程图 图3-3 解决八皇后问题的基本流程图4.代码编写八皇后问题是在限制条件下的排序问题include/数据流输入/输出#include/参数化输入/输出#include/定义杂项函数及内存分配函数#include/定义输入/输出函数/*-*/*-方法一:递归法-*/*-*/ static: 避免命名有冲突/棋盘初始化时,空格的地方为*,放置皇后的地方为 static char Queen88; static int a8;

20、 /数组ai:ai表示第i个皇后放置的列,i的范围:-8static int b15; /主对角线数组static int c15; /从对角线数组,根据程序的运行,去决定主从对角线是否放入皇后static int iQueenNum=0; /记录总的棋盘状态数static int iNum=1;void iQueen(int i); /参数i代表行void measure1() int iLine; /横行 int iColumn; /纵行 for(iLine=0;iLine8;iLine+) aiLine=0; /列标记初始化,表示无列冲突 for(iColumn=0;iColumn8;i

21、Column+) QueeniLineiColumn=*; for(iLine=0;iLine15;iLine+) /主、从对角线标记初始化,表示没有冲突 biLine=ciLine=0; iQueen(0);void iQueen(int i) /i为当前处理的行 int iColumn; for(iColumn=0;iColumn8;iColumn+) if(aiColumn=0&bi-iColumn+7=0&ci+iColumn=0) /如果无冲突 QueeniiColumn=; /放皇后 aiColumn=1; /标记,下一次该列上不能放皇后 bi-iColumn+7=1; /标记,下

22、一次该主对角线上不能放皇后 ci+iColumn=1; /标记,下一次该从对角线上不能放皇后 if(i7) iQueen(i+1); /如果行还没有遍历(沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问)完,进入下一行 else /否则输出 int iLine; /输出棋盘状态 int iColumn; cout(递归法)皇后摆放方式的第iNum种情况为:endl; for(iLine=0;iLine8;iLine+) for(iColumn=0;iColumn8;iColumn+) coutsetw(2)QueeniLineiColumn; coutendl; coutiNum:

23、; for(iLine=0;iLine8;iLine+) for(iColumn=0;iColumn8;iColumn+) if(QueeniLineiColumn=) cout(iLine+1,iColumn+1); coutnul); /从程序里调用pause命令,一个结果一个结果地看 iNum+; coutendl; /如果前次的皇后放置导致后面的放置无论如何都不能满足要求,则回溯,重新标记 QueeniiColumn=*; aiColumn=0; bi-iColumn+7=0; ci+iColumn=0; / if ends /*-*/*-方法二:运用类-*/*-*/自定义一个类:CQ

24、ueenclass cQueen int aQueen8; /可以在类外访问的私有成员(默认) int sum; public: /只能被该类的成员函数所访问的公有成员 cQueen(); /构造函数:确保每个对象正确地初始化 int judge(int x,int y); void show(); void step(); ; cQueen:cQueen()/通过构造函数对aQueen1-8初始化 sum=0; for(int i=0;i8;i+) aQueeni=0; int cQueen:judge(int x,int y) /判断皇后摆放位置是否有冲突,如果没有冲突,则返回;如果有冲突

25、,则返回 for(int i=0;ix;i+) if(aQueeni=y | aQueeni+x-i=y | aQueeni-x+i=y) return 0; return 1; void cQueen:step() /一步一步进行查找摆放 int x=0,y=0;/标记皇后所在键盘位置,x代表列,y代表行(相当于坐标) while(aQueen08) while(y8) if(judge(x,y) /调用类函数judge(x,y),如果aQueen1-8都已经标记,则执行该语句 aQueenx=y; /摆放皇后 x+; /进行下一列时 y=0; /y进行重置 else /否则,进入下一行 y

26、+; /当执行到最后一行时,继续执行下一个if语句 if(y=8&x!=8) /最后一行,从第一列开始 if(aQueen-x!=7) y=+aQueenx; else if(aQueen0!=7) y=+aQueen-x; else aQueen0=8; if(x=8) /最后一列 show(); /x,y从至结束,大循环结束 if(aQueen-x!=7) y=+aQueenx; else y=+aQueen-x; void cQueen:show()/输出棋盘状态 cout(非递归法)皇后摆放方式的第+sum种情况:endl; for(int i=0;i8;i+) /输出八皇后的各种状态,有皇后的位置用 表示,没有皇后的位置用* 表示 for(int j=0;jaQueeni;j+) coutsetw(2)*; coutsetw(2); for(j+;j8;j+) coutsetw(2)*; coutendl; coutsum: ; for(int k=0;k8;k+) cout(k+1,aQueenk+1); coutendlendl; / system(pause);/从程序里调用pause命令,一个结果一个结果地看 void measure2() cQueen a; a.step();

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1