标签:释放 ext 状态 八皇后 所有路径 约束 NPU print adl
回 溯 算 法:
【问题框架】
设问题的解是一个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.
标签:释放 ext 状态 八皇后 所有路径 约束 NPU print adl
原文地址:https://www.cnblogs.com/wfltest/p/8994350.html