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.

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com