【测试】图论专题训练--紧急援救
题目:紧急援救(bfs.pas/cpp/in/out)
题目描述
话说2007年8月5日,Mike博士神秘失踪了,最后发现是被外星人绑架了,幸好外星人目前还是在地球上活动,并且知道外星人不了解地球,幸好,Milk博士身上有无线信号发送装置,我们终于确定了他的位置,必须赶快到那里去救他。
根据无线信号发送装置,我们确定出一张地图,为了尽快寻找到Mike博士,于是这个光荣和艰巨的任务便交给了你,编写程序,通过使用一张地图帮助研究所确定从研究所出发找到Mike博士最短距离。
数据范围: n<=1000
输入格式
第一行为n
第二行为n*n的地图(其中0表示通路,1表示死路)
最后两行每行有两个数字,分别表示研究所的坐标和博士信号所在的位置。
输出格式
一个数字k,表示从研究所出发找到Milk博士的最短距离。
样例输入
10
0100110100
0001110010
1000000001
1000100011
0000101100
1000001100
1001010011
0000010100
0101010000
1001000001
1 7
10 2
样例输出
14
宽搜题目没什么难度,注意读的时候按字符读,然后一次判断,一定记得换行!(也可以一次读一行,然后把一行扫描一次)
Pascal Code
program bfs; const maxn=1000+10; dx:array[1..4] of longint=(0,0,1,-1); dy:array[1..4] of longint=(1,-1,0,0); type tnode=record x,y,step:longint; end; var n:longint; map:array[0..maxn,0..maxn] of longint; h:array[0..maxn,0..maxn] of boolean; q:array[0..maxn] of tnode; first,target:tnode; l,r:longint; procedure init; begin assign(input,'bfs.in'); assign(output,'bfs.out'); reset(input); rewrite(output); end; procedure outit; begin close(input); close(output); halt; end; procedure readdata; var i,j:longint; s:ansistring; begin readln(n); for i:=1 to n do begin read(s); for j:=1 to length(s) do begin map[i,j]:=ord(s[j])-ord('0'); if map[i,j]=1 then map[i,j]:=-1; end; readln; end; {for i:=1 to n do begin for j:=1 to n do write(map[i,j]); writeln; end;} read(first.x,first.y); read(target.x,target.y); end; procedure inq(var x:tnode); begin inc(r);r:=r mod maxn; inc(x.step); q[r]:=x; h[x.x,x.y]:=true; //writeln('X:',x.x,' Y:',x.y,' STEP:',x.step); if (x.x=target.x)and(x.y=target.y) then begin writeln(x.step); outit; end; end; function outq:tnode; begin inc(l); l:=l mod maxn; //h[q[l].x,q[l].y]:=false; exit(q[l]); end; function kuo(var node,newnode:tnode;i:longint):boolean; begin newnode:=node; with newnode do begin inc(x,dx[i]); inc(y,dy[i]); if (x<1)or(x>n)or(y<1)or(y>n)or(map[x,y]=-1) then begin exit(false); end; exit(true); end; end; procedure main; var node,newnode:tnode; i:longint; begin l:=0;r:=0; first.step:=-1;//入队后加1为0 inq(first); while l<>r do begin node:=outq; for i:=1 to 4 do //四种方案扩展 begin if kuo(node,newnode,i) then//可以扩展 begin if not h[newnode.x,newnode.y] then inq(newnode); end; end; end; end; begin init; readdata; main; outit; end.
..... 转载请注明出处 ..... http://oijzh.cnblogs.com ..... by jiangzh