为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

6回溯算法2

2011-03-15 3页 doc 43KB 36阅读

用户头像

is_505098

暂无简介

举报
6回溯算法2回溯算法2: 回溯算法2: 例5、n皇后问题(名题)。据说国王有n个皇后,为了减少皇后之间的矛盾,聪明的国王将御花园分割为n*n的棋盘格子形,皇后的寓所就在某个棋盘格子上,每个皇后的活动范围是所在格子沿上下左右及对角线的格子上。这样分配这n个皇后,就能使皇后之间活动范围没有交叉和重叠,从而避免了相互接触,减少了不必要的矛盾。试问怎样找出安置皇后寓所的方案,如果方案不唯一,,能否找出全部安置皇后寓所的方案。 问题分析:本问题可以转化为在n*n的格子内放置n个皇后,使得每行、每列以及对角线上都只有一个皇后,既不产生攻击。可以采用回...
6回溯算法2
回溯算法2: 回溯算法2: 例5、n皇后问题(名题)。据说国王有n个皇后,为了减少皇后之间的矛盾,聪明的国王将御花园分割为n*n的棋盘格子形,皇后的寓所就在某个棋盘格子上,每个皇后的活动范围是所在格子沿上下左右及对角线的格子上。这样分配这n个皇后,就能使皇后之间活动范围没有交叉和重叠,从而避免了相互接触,减少了不必要的矛盾。试问怎样找出安置皇后寓所的方案,如果方案不唯一,,能否找出全部安置皇后寓所的方案。 问题分析:本问题可以转化为在n*n的格子内放置n个皇后,使得每行、每列以及对角线上都只有一个皇后,既不产生攻击。可以采用回溯的办法沿着行或列的顺次放置皇后,然后判断所方位置是否与已经放置的皇后为之产生冲突,即是否在同一行、列或对角线上已经放置了皇后,如果有放弃该位置,选择下一个位置,如果没有,选择该位置,选择下一个皇后,在下一个行内继续试探放置;如果当前行所有位置都访问完毕没有合适的位置可以放置皇后,回溯返回上一行,重新选择位置。本题选择两个一维数组a[n],b[n](值为1,或为0表示该行,该烈是否已放置了皇后)。 搜索算法: program p6-5; procedure run(k:integer); var I:integer; function att:Boolean; begin att:=false ; for j:=1 to k-1 do if (abs(k-j)=abs(stack[j-]-I)) or (I=stack[j]) then begin att:=true;break; end; end; begin if k:=n+1 then begin inc (total) ;writeln(‘no’,total); for j:=1 to n do write(stack[j]:5); writeln; exit; end; for I:=1 to n do begin stack[k]:=I; if not att then run(k+1) else stack[k]=0; end; 例6、在n*n的棋盘上(1<=n<=10)填入1、2、3、….、n*n,共有n*n个数,使得任意相邻数的和为素数。 输入:n 输出:若有多个解,则需输出第一行、第一列之和均为最小的排列方案;若无解,则输出‘no’。 例如:n=2,有 n=4时,有 问题分析:本问题可看作将数据1..n*n放入n*n的表格中,且要求相邻两个数的和是素数,可以采用回溯的办法实现。问了避免在主程序中多次判断相邻的两个数的和sum是素数,将sum的所有可能得值先求出放到数组中,判断sum是否在该数组中即可。 源程序: program p6; const max=10; type arr=array[1..2*max*max] of boolean; var I,j,k,m,n,x,y:integer; t:arr;a:array[1..max,1..max] of integer; b:array[1..max,1..max] of boolean; function suc(x,y,k:integer):boolean; begin suc:=true; if x>1 then if not (t[a[x-1,y]+k]) then suc:=false; if y>1 then if not (t[a[x,y-1]+k]) then suc:=false; end; procedure print; var x,y:integer; begin for x:=1 to n do begin for y:=1 to n do write(a[x,y]:4); end; end; procedure try(x,y,dep:integer); var k:integer; begin if dep =n*n then begin print;halt;end; else for k:=1 to n*n do if not(h[k]) and suc(x,y,k) then begin a[x,y]:=k;h[k]:=true; if y=n then try(x+1,y,dep+1) else if x=n then try(x,y+1,dep+1); else if xn then max:=sum,b:=a; if max=n*(2n-1) then begin for r:=1 to n do begin for s:=1 to n do write(b[r,s]:5);writeln;end; halt; end; exit; end; for k:=1 to N*n div 2 do begin if (odd(i) xor odd(j)) then k1:=2k else k1:=2k-1; if not p[k1] then begin a[I,j]:=k1;p[k1]:=true; if I:=1 then begin if( (a[I,j]+a[I,j-1]) in su) and (sum+a[I,j]数学
解析法低。为了改善其时效,要尽可能减少分支(减少解答数的度)和增加约束条件(使其在保证出解的前提下尽可能”苛刻“)。另外还可以从下述两个方面考虑优化: 1​ 第归前对尚待搜索的信息进行预处理: 如果搜索对象是通过某种运算直接的出其结果,那么搜索前一般需进行预处理——通过相应运算将所艘搜索对象的计算结果致入常量表,搜索过程中只要将当前搜索对象的值从常量表中取出即可,这样可以显著改善搜索效率,否则,在搜索过程中每遇到这些对象都要计算,就会产生大量的重复计算。例如,例6中数字排列中将2,。。n*n中的素数置入一个常量表su,就是一种改善搜索效率的预处理。 2​ 记忆华搜索: 如果解答数中存在一些性质相同的子树,那么,只要我们知道了其中一颗子树的性质,就可以根据这个信息,导出其他子树的性质。这就是自顶向下记忆化搜索的基本思想。 练习: 1、​ 构造字符串。生成长度为n的字符串,其字符从26个英文字符前p个字母中选取,使得没有相邻的子序列相等。例如,p=3,n=5时,‘abcba’满足条件,’abcbc’不满足条件。 输入:n,p 输出:所有满足条件的字符串。 源程序: var n,p:intager; t1:longint; ed:char; s:string; procedure solve(at:integer); var ch:char;I:integer; begin if at=n+1 then begin writeln(s);inc(tl);exit end; for ch:=’a’ to ed do begin s:=s+ch; I:=1; While (I<=at div 2 ) and (copy(s,length(s)-I+1,I)<> (copy(s,length(s)-2*I+1,I))do inc(i); If I>at div 2 then sovle(at+1); Delete(s,length(s),1); End; End; Begin {main} Readln(n,p); Ed:=chr(ord(‘a’)+p-1); S:=’’;tl:=0;solve(1); Writeln(‘total:’,tl); End. 2、迷宫问题:有一个迷宫,要求寻找一条从入口A到出口B的可通路径。迷宫用二维矩阵M[X,Y]表示,表示为0的地方表示此方向不通,表示为1的路径表示此方向可以通过。图形表示如下: A
/
本文档为【6回溯算法2】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索