-
题意:
-
Oliver的救援
Time Limit:10000MS Memory Limit:65536K Total Submit:235 Accepted:51 Case Time Limit:1000MS
Description
在你的帮助下,Oliver终于追到小X了,可有一天,坏人把小X抓走了。这正是Oliver英雄救美的时候。所以,Oliver又找到哆啦A梦,借了一个机器,机器显示出一幅方格地图,它告诉Oliver哪里能走,哪里不能走,。并且Oliver在这个地图的右下角,而小X在左上角。时间紧急,Oliver想知道,最少要走多少个格子,才能找到小X。(只能直走)。
Input
共N+1行,第一行为N,以下N行N列0-1矩阵,1表示不能通过,0表示可以通过(左上角和右下角为0). N<30.
Output
共一个数,为最少的走的格子数.
Sample Input
5 0 1 1 1 1 0 0 1 1 1 1 0 0 0 1 1 1 1 0 1 1 1 1 0 0
Sample Output
9
-
题解:
-
跟电子老鼠差不多,电子老鼠改一改就行了。
-
-
const
-
dx:array[1..4] of integer=(-1,0,1,0); dy:array[1..4] of integer=(0,1,0,-1); var s,n,q1,q2,p2,p1:longint; state:array[1..1000000,1..2] of longint; father:array[1..1000000] of longint; a:array[0..10000,0..10000] of integer; procedure init; var i,j,k:longint; x:char; begin readln(n); for i:=1 to n do begin for j:=1 to n do begin read(x); a[i,j]:=ord(x)-ord('0'); end; readln; end; read(q1,q2,p1,p2); end; function check(x,y:longint):boolean; begin check:=true; if a[x,y]=1 then check:=false; if (x<1) or (y<1) or (x>n) or (y>n) then check:=false; end; procedure print(x:longint); begin if x=0 then exit; print(father[x]); inc(s); end; procedure bfs; var head,tail,i:longint; begin head:=0; tail:=1; state[1,1]:=q1; state[1,2]:=q2; repeat inc(head); 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[tail,1],state[tail,2]]:=1; if (state[tail,1]=p1) and (state[tail,2]=p2) then begin print(tail); write(s-1); tail:=0; end; end; until head>=tail; end; begin init; bfs; end.
Oliver的救援--SSL 2278
最新推荐文章于 2019-12-07 15:10:23 发布