野人传教士过河问题
野人和传教士各三人,小船只能载两人,要求野人的人数不能多于传教士。输出过河的方案
program yeren;
const
c:array[1..5,1..2]of integer=((1,0),(0,1),(1,1),(2,0),(0,2));
var
a:array[1..100,1..2]of integer;
function can(k:integer):boolean;//检验新产生的状态是否满足条件
var
i:Longint;
begin
if (a[k,1]<0)or(a[k,1]>3)or(a[k,2]<0)or(a[k,2]>3)then exit(false);//野人传教士人数是否符合实际情况
if (a[k,1]<a[k,2])and(a[k,1]>0)or(a[k,1]<a[k,2])and(a[k,2]<3) then exit(false);//野人数目不能大于传教士人数
for i:=1 to k-1 do
if (a[i,1]=a[k,1])and(a[i,2]=a[k,2]) then exit(false);
can:=true;
end;
procedure play(k,p:integer);
var
i,j:longint;
begin
if a[k,1]+a[k,2]=0 then
begin
for i:=1 to k do writeln('the step',i:2,':',a[i,1]:3,a[i,2]:3);
exit;
end;
for i:=1 to 5 do
begin
a[k+1,1]:=a[k,1]+p*c[i,1];
a[k+1,2]:=a[k,2]+p*c[i,2];
if can(k+1) then play(k+1,-p);
end;
end;
begin
assign(input,'win.in');
assign(output,'win.out');
reset(input);
rewrite(output);
a[1,1]:=3;a[1,2]:=3;
play(1,-1);
close(input);
close(output);
end.
。

浙公网安备 33010602011771号