您的位置:首页 > 其它

电子老鼠闯迷宫-ssl 1455

2016-12-22 16:29 211 查看
题意:

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

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=100;

  warn=4;

  ax:array[1..warn] of integer=(-1,0,1,0);

  ay:array[1..warn] of integer=(0,1,0,-1);

var

  a:array[1..maxn,1..maxn] of longint;

  father:array[1..maxn*maxn] of longint;

  state:array[1..maxn*maxn,1..2] of longint;

  dx,dy,px,py,n,last,s:longint;

procedure init;

var i,j:longint;

begin

  readln(n);

  readln(dx,dy,px,py);

  for i:=1 to n do

  begin

    for j:=1 to n do

    read(a[i,j]);

    readln;

  end;

end;

function check(x,y:longint):boolean;

begin

  if (x<1) or (x>12) or (y<1) or (y>12) then exit(false);

  if a[x,y]=1 then exit(false);

  exit(true);

end;

procedure print(x:longint);

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:longint;

begin

  head:=0;tail:=1;state[1,1]:=dx;state[1,2]:=dy;

  father[1]:=0;

  repeat

    inc(head);

    for k:=1 to warn do

    if check(state[head,1]+ax[k],state[head,2]+ay[k])

    then begin

           inc(tail);

           father[tail]:=head;

           state[tail,1]:=state[head,1]+ax[k];

           state[tail,2]:=state[head,2]+ay[k];

           a[state[tail,1],state[tail,2]]:=1;

           if (state[tail,1]=px) and (state[tail,2]=py)

           then begin

                  s:=0;

                  last:=tail;

                  print(tail);

                  writeln(s);

                  tail:=0;

                end;

         end;

 until head>=tail;

end;

begin

  init;

  bfs;

end.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: