电子老鼠闯迷宫
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.