八皇后问题的最佳解决方案_精品文档PPT推荐.ppt

上传人:b****2 文档编号:15487249 上传时间:2022-11-01 格式:PPT 页数:19 大小:1.01MB
下载 相关 举报
八皇后问题的最佳解决方案_精品文档PPT推荐.ppt_第1页
第1页 / 共19页
八皇后问题的最佳解决方案_精品文档PPT推荐.ppt_第2页
第2页 / 共19页
八皇后问题的最佳解决方案_精品文档PPT推荐.ppt_第3页
第3页 / 共19页
八皇后问题的最佳解决方案_精品文档PPT推荐.ppt_第4页
第4页 / 共19页
八皇后问题的最佳解决方案_精品文档PPT推荐.ppt_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

八皇后问题的最佳解决方案_精品文档PPT推荐.ppt

《八皇后问题的最佳解决方案_精品文档PPT推荐.ppt》由会员分享,可在线阅读,更多相关《八皇后问题的最佳解决方案_精品文档PPT推荐.ppt(19页珍藏版)》请在冰豆网上搜索。

八皇后问题的最佳解决方案_精品文档PPT推荐.ppt

,这是一种最简单的算法,通过八重循环模拟搜索空间中的88个状态,按深度优先思想,把第1个皇后放在第1列,然后开始搜索第2到第8个皇后的合理位置,每个皇后只能在同一行的8个位置存放,每前进一步检查是否满足约束条件,不满足时,检查下一个位置,若满足约束条件,开始下一个皇后的合理位置检查,直到找出8个皇后的所有合理位置(即问题的全部解)。

3.1枚举算法解决八皇后问题:

概述:

不在同一列的表达式为:

xixj;

不在同一主对角线上的表达式为:

xi-ixj-j;

不在同一负对角线上的表达式为:

xi+ixj+j.,约束条件,算法描述,Main1()inta9;

/初始化定义数组for(x1=1;

x1=8;

x1+)/从第一列开始搜索for(x2=1;

x2=8;

x2+)if(check(x2,2)=0)continue;

/如果约束条件满足,则执行下一个for语句,否则当前皇后位置向右移动一位继续检查约束条件for(x3=1;

x3=8;

x3+)if(check(x3,3)=0)continue;

/同上for(x4=1;

x4=8;

x4+)if(check(x4,4)=0)continue;

/同上for(x5=1;

x5=8;

x5+)if(check(x5,5)=0)continue;

/同上for(x6=1;

x6=8;

x6+)if(check(x6,6)=0)continue;

/同上,for(x7=1;

x7=8;

x7+)if(check(x7,7)=0)continue;

/同上for(x8=1;

x8=8;

x8+)/同上if(check(x8,8)=0)continue;

/同上else/找到了一组解for(i=1;

i=8;

i+)/输出一组满足约束的解print(xi);

check(intxi,intn)/该函数是用来判断是否满足约束inti;

for(i=1;

i=n-1;

i+)/这里只需要判断前n-1个if(abs(xi-xn)=abs(i-n)or(xi=xn)/判断是否同一列或者同一对角线return(0);

return

(1);

3.2非递归回溯解决八皇后问题:

算法1的枚举算法可读性很好,但它只能解决八皇后问题,而不能解决任意的n皇后问题。

因此不是通用的回溯算法。

下面的非递归算法可以说是通用的n皇后问题算法模型。

算法描述,ta20,n;

Main2()input(n);

bckdate(n);

/初始化,输入皇后数目backdate(intn)/该函数是用来寻找满足约束的全部解intk;

a1=0;

k=1;

/k用来表示第k个皇后while(k0)ak=ak+1;

while(ak=n)and(check(k)=0)/搜索第k个皇后位置ak=ak+1;

if(ak=n)if(k=n)output(n);

/找到一组解/elsek=k+1;

/继续为第k+1个皇后找到位置/ak=0;

/注意下一个皇后一定要从头开始搜索/elsek=k-1;

/回溯,check(intk)/检查皇后是否满足约束inti;

i=k-1;

i+)if(abs(ai-ak)=abs(i-k)or(ai=ak)return(0);

output()/输出满足该约束下的一组皇后位置inti;

i=n;

i+)print(ai);

3.3递归回溯解决八皇后问题:

对于回溯算法,更方便地是用递归控制方式实现,这种方式也可以解决任意的n皇后问题,算法的思想同样用深度优先搜索,在不满足约束条件时及时回溯。

与上面两个算法不同,都是用check()函数来检查当前状态是否满足约束条件,由于递归调用、回溯的整个过程是非线性的,用check()函数来检查当前状态是否满足约束条件是不充分的,而用check()函数(在算法1中说明)来检查当前状态是否满足约束条件又有太多冗余。

这里,我们“利用数组记录状态信息”的技巧,用三个数组c,b,d分别记录棋盘上的n个列、2n-1个主对角线和2n-1个负对角线的占用情况。

算法描述,inta20,b20,c40,d40;

intn,t,i,j,k;

/t记录解的个数,i控制行,j控制列main()inti,input(n);

/输入皇后的个数for(i=1;

i+)bi=0;

/记录棋盘n个列ci+1=0;

cn+i=0;

/记录棋盘负对角线di=0;

dn+i-1=0;

/记录棋盘主对角线try

(1);

try(inti)intj;

for(j=1;

j=n;

j+)/j表示列号,第i个皇后有n种可能位置if(bj=0)and(ci+j=0)and(di-j+n=0)/判断位置是否冲突ai=j;

/第i行第j列可以摆放编号为i的皇后bj=1;

/占领第j列ci+j=1;

di-j+n=1;

/占领两个对角线if(in)try(i+1);

/n个皇后没有摆完,递归摆放下一皇后elseoutput();

/完成任务,打印结果bj=0;

ci+j=0;

di-j+n=0;

/回溯,清理现场,从低向上回溯output()t=t+1;

/这里的t只是用来统计满足条件的解的个数print(t,);

for(k=1;

k=n;

k+)print(ak,);

print(“换行符”);

四算法分析与总结:

三种算法比较分析:

本文给出了求解八皇后的三种算法:

枚举算法、递归回溯算法和非递归回溯算法,分析了其执行时间复杂度,并得到了运行结果,得到了从枚举解答八皇后问题到递归回溯解答N皇后问题的最佳解决方案。

选择递归回溯法解决八皇后乃至N皇后问题更好,更具实用性。

算法总结,THANKYOU!

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 自我管理与提升

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

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