1. 程式人生 > >回溯算法模板

回溯算法模板

回溯 放置 str ber 滿足 adl ali input int

回 溯 算 法

【問題框架】

設問題的解是一個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.


回溯算法模板