- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
皇后问题(Queens)实验上机报告.doc
皇后问题 Queens 实验上机报告
程序名称:皇后问题 Queens v1.0.0.2
程序设计环境:
硬件环境:Intel Pentium Ⅱprocessor
451 MHz
128 MB of Ram
操作系统:Microsoft Windows XP
Professional
Version 2002
编程软件:Visual C++ 6.0
程序可执行环境:Microsoft Windows 32/9x/NT/2000/XP/2003
试验目的:
掌握函数的递归调用
掌握求解回退算法
实现对n个皇后问题求解的一般方法
实验过程:
设想使用1位数组实现对n皇后问题的求解
设想理由(以8皇后问题作为入手点):
由于8个皇后中人以两个不在一行、不在一列、不在同一主对角线,不在同一列对角线,因此,每行只可能有一个皇后,只需要顺序记录下每行所放的皇后所在列的号码,就可以将整个棋形图进行记录。
在算法方面,可以使用一位数组的序号 index 纪录行标,其相应值记录列标。从下标0开始自小而大依次进行放子,总是放到当前行第一个未被使用的Free(满足8皇后问题的条件的)格子上。每放完一行,就对下一行(作为当前行)进行放置,如果8个皇后都已放下,输出结果。当前行如果没有地方放置棋子,将当前行复位(reset)并返回到上一行进行放置,如果首行再也没法放子,则标志所有可能都已访问。则在这里可以设置程序的出口。
定义声明Queens类。
根据设想,对Queens类进行生成,构造函数Queens int s 对类进行初始化其中s为初始化棋盘的大小,默认值为8。solve_from 函数为主要求解函数,当找不到下一种解,即已求完全部解。size纪录了棋盘的大小,count记录了当前行行标。Square为纪录棋形图数组的头指针。GetNextFreeCol int the_row 函数作用为找当前行的下一个空位(即第一个为被用的位置)。checkFree int,int,int,int 函数作用为判断某个格子和另一个格子是否发生冲突(两个皇后能否相互吃掉)不冲突返回真,冲突返回假。Print 函数为结果输出函数。
主要函数设计草图:
棋形图的初始化:
for int i;i size;i++ s[i] -1; 得到第i排的下一种情况,返回列标
声明:int GetNextFreeCol int i
算法:
function start
got false;
for int value 现在的value+1;value size且!got(即还没有找到);value++ for int row 0;列不重合、主对角线不重合、从对角线不重合、row I;row++ ;
got row i ; 如果got 1,返回value—
否则返回-1(复位)
function end
得到当前情况的下一种情况
声明:void solve_from
算法:
function start
Square[count] GetNextFreeCol Col ;
If Square[count] -1 count--;
如果count -1→出口 else count++;
if count size print输出 再次调用solve_from;
function end
类的功能测试
test function start
Queens test 4 ;
test.solve_from ;
Return 0;
Function end
测试输出
1 3 0 2
2 0 3 1
完善Queens类
添加私有成员函数total用于记录solve_from调用的次数
添加私有成员函数result用于记录所有解的个数
添加私有成员cfPtr用于实现结果的存盘
添加私有成员start,end用于计算程序运行所用的时间 以毫秒计
完善主程序
完善程序界面
实现自定义棋盘大小
当实现后发现当size 9时,变成环境报错”Stack overflow”,经分析,是由于调用solve_from后没有退出当前函数又进行下一个solve_from造成资源的严重不足,于是决定改善solve_from函数为bool类型,每次只算下一种解,在函数出口,如果找不到下一种解(即已求得全部解),返回true,否则返回false
通过对返回值的判断,是该函数返回true时与程序的出口相连,从而解决了调用的资源负担。
实现计算当前的CPU频率(其中计算CPU频率的函数转自北信技术论坛)
实现存盘
调试过程简述:
初始类的测试
Queens Test 4 ;
Test.solve_from ;
输出:
Sol[1]:[1,2] [2,4] [3,1] [4,3]
文档评论(0)