野人传教士过河问题

野人和传教士各三人,小船只能载两人,要求野人的人数不能多于传教士。输出过河的方案

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.

  

posted @ 2012-04-08 16:26  翱翔的感觉  阅读(699)  评论(0)    收藏  举报