(ssl1455)电子老鼠闯迷宫

电子老鼠闯迷宫
Time Limit:1000MS  Memory Limit:65536K
Total Submit:151 Accepted:107




Description




如下图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
Source




elba
注意:在旧版本中,不可使用“dx:array[1..4] of longint=(-1,0,1,0);dy:array[1..4] of longint=(0,1,0,-1);”
只能慢慢自己打“dx[1]:=-1;”这样子打表。(在题库中错过了,好郁闷(;′⌒`))
var
 dx:array[1..4] of longint=(-1,0,1,0);//横坐标的移动,正为左,负为右
 dy:array[1..4] of longint=(0,1,0,-1);//纵坐标的移动,正为上,负为下
a:array[0..12+1,0..12+1] of longint;//迷宫的范围
 father:array[1..12*12] of longint;//父节点的序号
 state:array[1..12*12,1..2] of longint;//节点的横坐标(1),纵坐标(2)
 px,py,qx,qy,s,last:longint;
procedure init;//输入
var
 i,j,n:longint;
begin
 readln(n);
 read(px,py,qx,qy);
 for i:=1 to n do
  begin
   for j:=1 to n do
   read(a[i,j]);
   readln;
  end;
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,x,y:longint;//k为方向
begin
 head:=0;tail:=1;
 state[1,1]:=px;state[1,2]:=py;
 father[1]:=0;
 repeat
  inc(head);
  for k:=1 to 4 do
   begin
    x:=state[head,1]+dx[k];
    y:=state[head,2]+dy[k];
    if (x>=1) and (x<=12) and (y>=1) and (y<=12) and (a[x,y]=0)then//若不超出迷宫范围,且没有做过
     begin
      inc(tail);
      father[tail]:=head;
      state[tail,1]:=x;
      state[tail,2]:=y;
      a[x,y]:=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;
   end;
 until head>=tail;
end;
begin
 init;
 bfs;
end.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值