电子老鼠闯迷宫
Time Limit:1000MS Memory Limit:65536K
Total Submit:151 Accepted:107
Description
如下图12×12方格图,找出一条自入口(2,9)到出口(11,8)的最短路径。
Input
Output
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
-
var i,m,j,n,px,py,zx,zy,last:longint; wayn:array[1..4,1..2]of longint; map:array[0..200,0..200]of longint; s:array[0..2000,0..4]of longint; f:array[0..2000]of longint; procedure print(x:integer); begin if x=0 then exit; inc(m); print(f[x]); if x<>last then write('(',s[x,1],',',s[x,2],')->') else writeln('(',s[x,1],',',s[x,2],')'); end; function check(y,x:integer):boolean; begin check:=true; if (x<1) or (x>n) or (y<1) or (y>n) then check:=false; if map[y,x]=1 then check:=false; end; procedure bfs; var tail,head,k,i:longint; begin tail:=1; head:=0; s[1,1]:=py; s[1,2]:=px; f[1]:=0; repeat head:=head+1; for i:=1 to 4 do if check(s[head,1]+wayn[i,1],s[head,2]+wayn[i,2]) then begin tail:=tail+1; f[tail]:=head; s[tail,1]:=s[head,1]+wayn[i,1]; s[tail,2]:=s[head,2]+wayn[i,2]; map[s[tail,1],s[tail,2]]:=1; if (s[tail,1]=zy)and(s[tail,2]=zx)then begin m:=0; last:=tail; print(tail); writeln(m); tail:=0; end; end; until head>=tail; end; begin readln(n); read(py,px,zy,zx); for i:=1 to n do for j:=1 to n do read(map[i,j]); map[py,px]:=1; wayn[1,1]:=1;wayn[1,2]:=0; wayn[2,1]:=0;wayn[2,2]:=-1; wayn[3,1]:=-1;wayn[3,2]:=0; wayn[4,1]:=0;wayn[4,2]:=1; bfs; end.
这是一道广搜题,思路和广搜一样。第一次写,感觉好难。