关于c语言编程中八皇后问题的设计报告_第1页
关于c语言编程中八皇后问题的设计报告_第2页
关于c语言编程中八皇后问题的设计报告_第3页
关于c语言编程中八皇后问题的设计报告_第4页
关于c语言编程中八皇后问题的设计报告_第5页
免费预览已结束,剩余12页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、关于 c 语言编程中八皇后问题的设计报告一、课题的来源及意义八皇后问题是一个古老而著名的问题,该问题是十九世纪著名的数学家高斯1850 年提出的。在国际象棋中,皇后是最有权利的一个棋子;只要别的棋子在它的同一行或同一列或同一斜线(正斜线或反斜线)上时,它就能把对方棋子吃掉。所以高斯提出了一个问题:在8*8 的格的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一列、同一行、或同一条斜线上面,问共有多少种解法。到了现代,随着计算机技术的飞速发展,这一古老而有趣的数学游戏问题也自然而然的被搬到了计算机上。运用所学计算机知识来试着解决这个问题是个锻炼和提高我自己编程能力和独立解决

2、问题能力的好机会,可以使我增强信心,为我以后的编程开个好头,故我选择了这个有趣的课题。二、面对的问题1)解决冲突问题:这个问题包括了行,列,两条对角线;列:规定每一列放一个皇后,不会造成列上的冲突;行:当第I 行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I 为下标的标记置为被占领状态;2)使用数据结构的知识,用递归法解决问题。三、需求分析1、涉及到的知识本次设计中,用到的主要知识有:递归法的运用,for 语句的灵活运用,数据结构中树知识的灵活运用、栈及数组的掌握。2、软硬件的需求1)系统要求:win xp 以上操作系统;2)语言平台:tc+或 vc+6.0;3、功能需求当运行

3、程序时,在屏幕上显示每一种方法八个皇后的相对位置,要用比较直观的界面显示。我的思想是用循环递归循环来实现的,分别一一测试了每一种摆法, 并把它拥有的92种变化表现出来。在这个程序中,我的主要思路以及思想是这样的:1)解决冲突问题:这个问题包括了行,列,两条对角线;列:规定每一列放一个皇后,不会造成列上的冲突;行:当第I 行被某个皇后占领后,则同一行上的所有空格都不能再放皇后,要把以I 为下标的标记置为被占领状态;对角线:对角线有两个方向。在这我把这两条对角线称为:主对角线和从对角线。在同一对角线上的所有点(设下标为(i,j) ) ,要么 (i+j) 是常数,要么(i-j) 是常数。因此,当第I

4、 个皇后占领了第 J 列后, 要同时把以(i+j) 、 (i-j) 为下标的标记置为被占领状态。2)数据结构的实现而对于数据结构的实现,学生则是着重于:数组 aI : a I 表示第 I 个皇后放置的列;I 的范围:1.8;对角线数组:bj( 主对角线),cj (从对角线),根据程序的运行,去决定主从对角线是否放入皇后;五、详细设计和实现1、算法描述A、 数据初始化。B、 从n 列开始摆放第n 个皇后(因为这样便可以符合每一竖列一个皇后的要求),先测试当前位置(n,m)是否等于0(未被占领) 。如果是,摆放第n 个皇后,并宣布占领(记得姚横列竖列斜列一起设置),接着进行递归;如果不是,测试下一

5、个位置(n, m+1) ,但是如果当n<=8, m=8时,发现此时已无法摆放时,便要进行回溯。从问题的某一种可能出发,搜索从这种情况能出发,继续搜索,这种不断“回溯”的寻找解的方法,称为“回溯法”。C、使用数组实现回溯法的思想。D、当n>8时,便打印出结果。E、 输出函数我使用printf 输出, 运行形式为:第 m种方法为:* * * * * * * *2、算法流程图六、代码编写及详细注释#include <conio.h>#include <math.h>#include <stdlib.h>#include <stdio.h>#

6、include <iostream.h>#define QUEENS 8int iCount = 0; /!记录解的序号的全局变量。int SiteQUEENS; /!记录皇后在各行上的放置位置的全局数组。void Queen(int n); /! 递归求解的函数。void Output();/! 输出一个解。int IsValid(int n);/! 判断第 n 个皇后放上去之后,是否有冲突。void main() /*Main: 主 函 数 。*/ system("title叶青 - 递归算法八皇后问题");cout<<""&

7、lt;<"八皇后的解法:"<<endl;cout<<" "<<""<<endl;Queen(0); /! 从第 0行开始递归试探。getch();/! 按任意键返回。void Queen(int n) /*Queen:递归放置第n 个皇后,程序的核心!*/ int i;if(n = QUEENS) /! 参数 n 从 0 开始,等于8 时便试出了一个解,将它输出并回溯。 Output(); return; 还没到8,在第n 行的各个行上for(i = 1 ; i <= QUE

8、ENS ; i+) /!n依次试探。Siten = i; /!在该行的第i 行上放置皇后。if(IsValid(n) /! 如果放置没有冲突,就开始下一行的试探。Queen(n + 1); n 个皇后放上去之后,是int IsValid(int n) /*IsValid否合法,即是否无冲突。*/int i;for(i = 0 ; i < n ; i+) /!将第 n 个皇后的位置依次于前面n 1 个皇后的位置比较。if(Sitei = Siten) /!两个皇后在同一列上,返回0。return 0;两个皇后在同一对角线上,if(abs(Sitei - Siten) = (n - i) /

9、!返回0。return 0; return 1; /! 没有冲突,返回1。void Output()/*Output :输出一个解,即一种没有冲突的放置方案。 */int i;printf("No.%-5d" , +iCount); /!输出序号。for(i = 0 ; i < QUEENS ; i+)/!依次输出各个行上的皇后的位置,即所在的列数。printf("%d " , Sitei);printf("n");七、程序调试调试过程、步骤及遇到的问题在完整程序调试时遇到几个小问题,后经细心改正后才把调试工作做完。例如 : 当

10、用 printf 输出时 , 出现了一些错误, 几经调试后, 发现原来是缺少了stdio.h 这样一个头文件, 添加了头文件后, 还出现了一些问题, 逻辑错误导致程序死循环或不循环或循环一小部分, 但是编译时却没有错误, 就是没有正确的输出答案, 一开始我也不知道是怎么回事, 通过和同学的交流, 发现是逻辑错误, 经过改正后, 程序终于可以运行了.八、运行与测试运行演示九、总结在这次的程序设计,我从中得到了许多的经验以及软件设计的一些新的思路;从这个八皇后问题设计以及分析中,本人从中理解到了数据结构对于计算机软件设计的重要性,它的使用,可以改变一个软件的运行周期,也可以将软件的思路从繁化简,并

11、且都能够通过数据结构的相关引导,将本身以前编程思想进行扩充,发展;这也是在这次课程设计中我所掌握得到的。但由于我的基本知识还不是那么扎实,也缺乏对软件设计的经验,在这过程中也出现了一些问题,如,八皇后在变成初期由于没真正体会到数据结构中“树”在里面的运用, 将程序往大一时c 语言的方向发展,不自觉的采用了非递归的算法,结果大大增加了程序的复杂程度。 并且也让整个程序的时间复杂度变得更大;在后来学生对数据结构的第六章进行了比较深入的研读,才发现了数据结构树的实际运用的空间是相当的大,并且,通过了重温树的回溯,以及二叉树的遍历,最终将程序进行了一次较大的改造。并且通过思考,再将以前的数组知识加以运

12、用才最终解决了这个问题,整个程序的算法的可看性也有了相当的改进。以前对数据结构的学习还是具有相当大的意义,它从一个程度上改变了我们的编程思想,如何将一个程序快速而又准备的进行编写,进行编译,都成为了我们思考的重点,也通过这一门课的学习,我们将数据结构的思想带入到了我们以后的编程学习中去。在这个阶段,我也明白了,好的思想,不能提留于字面上的认知,还需要的是平时多练多写一些相关的程序,并且通过修改,加入新的算法去尝试改变自己的一些编程思想。保持更新算法的速度,这才是关键。我觉得还可以考虑开发N皇后问题, 在主界面中添加一个int 型的变量 , 程序一开始要求输入一个数( 确定是几皇后问题), 输入后按下 enter 后 , 输出各种解. 主程序与八皇后的求解大体相同.十、参考文献1 苏仕华 , 数据结构课程设计.- 北京 : 机械工业出版社,2005.52 于永彦 , 赵建洋 . 课程设计指导书. 淮安:江苏淮阴工学院计算机工程系 ,20063 刘振安 , 刘燕君,孙忱. C+ 语言课程设计. 北京:高等教育出版社 ,20034 陈志泊 , 张海燕 , 王春玲 . Visual C+ 程序设计

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论