八数码广搜
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.