算法实验 递归回溯解八皇后问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
深圳大学实验报告
课程名称:算法分析与复杂性理论
实验项目名称:八皇后问题
学院:计算机与软件学院
专业:软件工程
指导教师:杨烜
报告人:学号:班级:15级软工学术型实验时间:2015-12-08
实验报告提交时间:2015-12-09
教务部制
一.实验目的
1.掌握选回溯法设计思想。
2.掌握八皇后问题的回溯法解法。
二.实验步骤与结果
实验总体思路:
根据实验要求,通过switch选择八皇后求解模块以及测试数据模块操作,其中八皇后模块调用摆放皇后函数模块,摆放皇后模块中调用判断模块。测试数据模块主要调用判断模块进行判断,完成测试。用一维数组保存每行摆放皇后的位置,根据回溯法的思想递归讨论该行的列位置上能否放置皇后,由判断函数Judge()判断,若不能放置则检查该行下一个位置。相应结果和过程如下所示(代码和结果如下图所示)。
回溯法的实现及实验结果:
1、判断函数
代码1:
procedure BTrack_Queen(n)
//如果一个皇后能放在第K行和X(k)列,则返回true,否则返回false。
global X(1:k);integer i,k
i←1
while i if X(i)=X(k) or ABS(X(i)-X(k))=ABS(i-k) then return (false) endif i←i+1 repeat return (true) end Judge 2、回溯递归求解 代码2: procedure BTrack_Queen(n) integer k,n,X(1:n) X(1)←0;k←1 //k是当前行,X(k)是当前行的位置 while k>0 do X(k)←X(k)+1 //移到下一个位置 while X(k)<=n and not Judge(k) do //判断能否放置皇后 X(k)←X(k)+1 repeat if X(k)<=n //找到一个位置 then if k=n //是一个完整的解吗 then print(X) //是,打印数组else k←k+1;X(k)←0 //转向下一行 endif else k←k-1 //否则,回溯上一行 endif repeat end BTrack_Queen 实验结果: (图1 回溯法解八皇后问题) (图2 回溯法解八皇后问题) (图3 测试数据结果) 注:根据实验数组中保存的列坐标,对应行坐标顺序输入即可。实验中多加入了一组不满足八皇后问题的解。 MFC可视化下八皇后的实现与结果: 代码3: //判断是否符合八皇后问题的解 int CBfhouDlg::check(int row, int col){ //看同行是否合法; for(int i=0;i<=col-1;i++){ if(a[row][i]==1) return 0; } for(i=col+1;i<8;i++) { if(a[row][i]==1) return 0; } //看同列是否合法; for(i=0;i<=row-1;i++) { if(a[i][col]==1) return 0; } for(i=row+1;i if(a[i][col]==1) return 0; } //看对角线是否合法; i=row-1; j=col+1; while(i>=0&&j<= N-1){ if(a[i][j]==1) return 0; --i;++j; } i=row+1; j=col-1; while((i<=N-1)&&j>=0){ if(a[i][j]==1) return 0; ++i;--j; } i=row-1;j=col-1; while(i>=0&&j>=0){ if(a[i][j]==1) return 0; --i;--j; } i=row+1;j=col+1; while((i<=N-1)&&j<=N-1){ if(a[i][j]==1) return 0; ++i;++j; } return 1; } 实验结果: (图4 八皇后的第1种解) (图5 八皇后的第92种解) 注:由于时间有限,这个月考试较多,程序还要很多地方需要完善。 三.实验分析与结论 根据八皇后问题的规则皇后不能放置在同行、同列及同一对角线上,进而将问题转化为将第i个皇后放在第i行第x[i]列上(1 四.实验心得 八皇后问题以前也看过,只是以前没有将测试数据模块和解八皇后问题模块整合到主函数中,后面也想到用MFC实现可视化求解,但是之前都没学过MFC编程,根据网上的资料还是完成了较为基本的程序。这次实验确实学到很多东西,不光是提高了编程能力、代码阅读能力,更掌握了回溯法的递归求解思路。