八数码广搜

program bashuma;
const
   dir:array[1..4,1..2]of integer=((1,0),(-1,0),(0,1),(0,-1));
   maxl=1000;
type
   sta=record
       kx,ky:integer;
       m:array[1..3,1..3]of integer;
       end;
var
   tar,old,new:sta;
   i,j,head,tail,k:integer;
   q:array[1..maxl]of sta;
   gans:boolean;

function gnew(k:integer):boolean;//找到新节点
var
 i,j:integer;
 flag:boolean;
begin
         gnew:=true;

         new.kx:=old.kx+dir[k,1];
         new.ky:=old.ky+dir[k,2];
         if (new.kx>0)and(new.kx<4)and(new.ky>0)and(new.ky<4)then
          begin
              new.m[old.kx,old.ky]:=new.m[new.kx,new.ky];
              new.m[new.kx,new.ky]:=0;

              //pan chong
              for k:=1 to tail-1 do
              begin
              if (new.kx<>q[k].kx)or(new.ky<>q[k].ky)then continue;
                  flag:=true;
                  for i:=1 to 3 do
                   for j:=1 to 3 do
                    if new.m[i,j]<>q[k].m[i,j] then
                      begin flag:=false; break;break;end;

                  if flag then exit(false);
               end;

          end else exit(false);
end;

  function getans(new:sta):boolean;//检测找到答案
  var
   i,j:integer;
  begin
     getans:=true;
     if (new.kx<>tar.kx)or(new.ky<>tar.ky)then exit(false);


     for i:=1 to 3 do
      for j:=1 to 3 do
      if new.m[i,j]<>tar.m[i,j] then exit(false);
  end;

  procedure print(tail:integer);
  var
   i,j,k:integer;
  begin
      for k:=1 to tail do
       begin
           for i:=1 to 3 do
            begin
              for j:=1 to 3 do write(q[k].m[i,j]);
              writeln;
            end;
            writeln;
       end;
  end;


begin
     assign(input,'win.in');
     assign(output,'win.out');
     reset(input);
     rewrite(output);

     for i:=1 to 3 do
     begin
      for j:=1 to 3 do
       begin
          read(q[1].m[i,j]);
          if q[1].m[i,j]=0 then begin q[1].kx:=i;q[1].ky:=j;end;
       end;
       readln;
     end;
     for i:=1 to 3 do
     begin
      for j:=1 to 3 do
       begin
          read(tar.m[i,j]);
          if tar.m[i,j]=0 then begin tar.kx:=i;tar.ky:=j;end;
       end;
       readln;
     end;

     head:=0;tail:=1;


     while head<tail do
      begin
        inc(head);
        old:=q[head];

        for k:=1 to 4 do
        begin
         new:=old;
         if gnew(k) then
          begin
              inc(tail);
              q[tail]:=new;
              if getans(new)then begin print(tail); halt;  end;//此时注意找到答案后一定的用halt结束

            //  if tail=100 then begin print(tail);halt; end;
          end;
        end;
      end;


     close(input);
     close(output);
end.

  

posted @ 2012-04-22 17:52  翱翔的感觉  阅读(195)  评论(0)    收藏  举报