pascal回溯
发布网友
发布时间:2022-04-20 02:40
我来回答
共2个回答
热心网友
时间:2023-07-01 00:48
program e;
var
n,t:longint;
a:array[1..8] of integer;
flag:array[1..8] of boolean;
procere search(depth:integer); {depth变量表示正在搜索第几个元素}
var
i:integer;
begin
if(depth>n) then {depth>n表明已经搜索到了第n个数,那么输出结果}
begin
for i:=1 to n do write(a[i]:4);
writeln;
inc(t);
exit; {此种结果输出后,退出该层搜索}
end;
for i:=1 to n do {枚举下一个出现的元素}
if flag[i]=false then {判断是否已经出现过}
begin
a[depth]:=i; {没有出现,则把第depth个数设为i}
flag[i]:=true; {给这个标志变量给出出现的标志}
search(depth+1); {递归搜索下一个元素}
flag[i]:=false; {回溯,此时恢复这个标志变量为没出现的标志}
end;
end;
begin
writeln('input N:');
read(n);
t:=0;
fillchar(flag,sizeof(flag),false); {赋初值,设定全部没有出现过}
search(1);
writeln('Total=',t);
end.
下面一题只要略作修改就行了,自己编吧……………^_^
打字不易,如满意,望采纳。追问不是看的太懂。。希望帮忙修改
热心网友
时间:2023-07-01 00:49
var a:array[1..20,1..20]of integer;
s:set of 1..20;
min,sum,n,i,j:integer;
procere work(r:integer);
var i:integer;
begin
for i:=1 to n do
if not (i in s) then
begin
s:=s+[i]; inc(sum,a[r,i]);
if r=n then
if sum<min then min:=sum else
else work(r+1);
s:=s-[i]; dec(sum,a[r,i]);
end;
end;
begin
read(n);
for i:=1 to n do
for j:=1 to n do
read(a[i,j]);
s:=[]; min:=maxint;
work(1);
writeln(min);
end.