算法实验 递归回溯解八皇后问题

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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编程,根据网上的资料还是完成了较为基本的程序。这次实验确实学到很多东西,不光是提高了编程能力、代码阅读能力,更掌握了回溯法的递归求解思路。

相关文档
最新文档