回溯算法模板
回 溯 算 法:
【問題框架】
設問題的解是一個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.
回溯算法模板