题目:

如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。
Sample Input

12 //迷宫大小
2 9 11 8 //起点和终点
1 1 1 1 1 1 1 1 1 1 1 1 //邻接矩阵,0表示通,1表示不通
1 0 0 0 0 0 0 1 0 1 1 1
1 0 1 0 1 1 0 0 0 0 0 1
1 0 1 0 1 1 0 1 1 1 0 1
1 0 1 0 0 0 0 0 1 0 0 1
1 0 1 0 1 1 1 1 1 1 1 1
1 0 0 0 1 0 1 0 0 0 0 1
1 0 1 1 1 0 0 0 1 1 1 1
1 0 0 0 0 0 1 0 0 0 0 1
1 1 1 0 1 1 1 1 0 1 0 1
1 1 1 1 1 1 1 0 0 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1

Sample Output

(2,9)->(3,9)->(3,8)->(3,7)->(4,7)->(5,7)->(5,6)->(5,5)->(5,4)->(6,4)->(7,4)->(7,3)->(7,2)->(8,2)->(9,2)->(9,3)->(9,4)->(9,5)->(9,6)->(8,6)->(8,7)->(8,8)->(9,8)->(9,9)->(10,9)->(11,9)->(11,8)
27

题解:
这道题可用深搜和广搜,但广搜效率高。
我们上下左右搜。

代码如下:

const
  maxn=12;
  wayn=4;
  dx:array[1..wayn] of integer=(-1,0,1,0);
  dy:array[1..wayn] of integer=(0,1,0,-1);
var px,py,qx,qy,s,last:integer;
    a:array[0..maxn+1,0..maxn+1] of integer;
    father:array[1..maxn*maxn] of integer;
    state:array[1..maxn*maxn,1..2] of integer;
procedure init;
var i,j,n:integer;
begin
  readln(n);
  read(px,py);
  readln(qx,qy);
  for i:=1 to n do
  begin
    for j:=1 to n do
      read(a[i,j]);
    readln;
  end;
end;
function check(x,y:integer):boolean;
begin
  check:=true;
  if (x<1) or (x>12) or (y<1) or (y>12) then check:=false;
  if a[x,y]=1 then check:=false;
end;
procedure print(x:integer);
begin
  if x=0 then exit;
  inc(s);
  print(father[x]);
  if x<>last then write('(',state[x,1],',',state[x,2],')->')
             else writeln('(',state[x,1],',',state[x,2],')')
end;
procedure bfs;
var tail,head,k,i:integer;
begin
  head:=0;tail:=1;state[1,1]:=px;state[1,2]:=py;
  father[1]:=0;
  repeat
    head:=head+1;
    for k:=1 to wayn do
      if check(state[head,1]+dx[k],state[head,2]+dy[k]) then
      begin
        tail:=tail+1;
        father[tail]:=head;
        state[tail,1]:=state[head,1]+dx[k];
        state[tail,2]:=state[head,2]+dy[k];
        a[state[tail,1],state[tail,2]]:=1;
        if (state[tail,1]=qx) and (state[tail,2]=qy)then
        begin
          s:=0;
          last:=tail;
          print(tail);
          writeln(s);
          tail:=0;
        end;
      end;
    until head>=tail;
  end;
begin
  init;
  bfs;
end.