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
程序如下:
var dx,dy:array[1..4] of longint; father:array[0..400]of longint; state:array[0..400,1..2]of longint; a:array[1..20,1..20]of longint; i,j,n,s,px,py,qx,qy:longint; procedure print(x:longint); begin if x=0 then exit; inc(s); print(father[x]); if x<>1 then write('->','(',state[x,1],',',state[x,2],')') else write('(',state[x,1],',',state[x,2],')'); end; function check(x1,y1:longint):boolean;//这一个函数主要用于判断边界情况 begin if (x1>=1)and(x1<=n)and(y1>=1)and(y1<=n) then if a[x1,y1]<>1 then exit(true) else exit(false); end; procedure bfs;//用广搜 var i,x2,y2,head,tail:integer; begin head:=0; tail:=1; father[1]:=0; repeat inc(head); state[1,1]:=px; state[1,2]:=py; for i:=1 to 4 do if check(state[head,1]+dx[i],state[head,2]+dy[i]) then begin inc(tail); father[tail]:=head; state[tail,1]:=state[head,1]+dx[i]; state[tail,2]:=state[head,2]+dy[i]; a[state[head,1]+dx[i],state[head,2]+dy[i]]:=1; if (state[tail,1]=qx)and(state[tail,2]=qy) then begin print(tail); tail:=0; end; end; until (head>=tail); end; begin dx[1]:=0; dy[1]:=1; dx[2]:=0; dy[2]:=-1; dx[3]:=1; dy[3]:=0; dx[4]:=-1; dy[4]:=0; readln(n); readln(px,py,qx,qy); for i:=1 to n do for j:=1 to n do read(a[i,j]); bfs; writeln; write(s); end.