回溯算法模板

回溯算法

【问题框架】

      设问题的解是一个n维向量(a1,a2,………,an),约束条件是ai(i=1,2,3,…..,n)之间满足某种条件,记为f(ai)。

begin 

for i:=1 to 算符种数 Do  {算符:枚举所有路径}

begin 

保存结果 

if  到目的地  then  输出解 

else Try(k+1); 

恢复:保存结果之前的状态{回溯一步} 

end; 

end; 

 

例一:八皇后问题:

放置第i个皇后的算法为: (递归算法)

procedure Try(i); 

begin 

if i>8 then 输出一组结果;exit;(和下面红色部分二选一)

for 第i 个皇后的位置=1 to 8 do 

if  安全  then 

begin 

放置第 i个皇后; 

对放置皇后的位置进行标记; 

if i=8 then 输出  else 

Try(i+1);{放置第 i+1个皇后} 

对放置皇后的位置释放标记,尝试下一个位置 

       end; 

end;  

例 2:设有 n 个整数的集合{1,2,…,n},从中取出任意 r 个数进行排列(r<n),试列出所有的排列。 

type se=set of 1..100; 

VAR s:se;n,r,num:integer; 

b:array [1..100] of integer; 

PROCEDURE print; 

var i:integer; 

begin 

num:=num+1; 

for i:=1 to r do  write(b[i]:3); 

writeln; 

end; 

PROCEDURE try(k:integer); 

VAR i:integer; 

begin 

for i:=1 to n do 

if i in s then 

begin  b[k]:=i;  s:=s-[i]; 

if k=r then print  else try(k+1); 

s:=s+[i]; 

end; 

end; 

BEGIN  {main}

write('Input n,r:');readln(n,r); 

s:=[1..n];num:=0; 

try(1); 

writeln('number=',num); 

END.  


 

猜你喜欢

转载自www.cnblogs.com/wfltest/p/8994350.html