题目:紧急援救 rqnoj34
题目描述
话说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 rqnoj34;
const
maxq=1000*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:longint;
step:longint;
end;
var
n:longint;
map:array[0..1000+10,0..1000+10] of boolean;
first,target:tnode;
l,r:longint;
q:array[0..maxq] of tnode;
h:array[0..1000+10,0..1000+10] of boolean;
procedure init;
begin
assign(input,'rqnoj34.in');
assign(output,'rqnoj34.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
readln(s);
for j:=1 to length(s) do
if s[j]='0' then map[i,j]:=true
else if s[j]='1' then map[i,j]:=false;
end;
read(first.x,first.y);
read(target.x,target.y);
end;
procedure inq(var x:tnode);
begin
inc(r);r:=r mod maxq;
inc(x.step);
q[r]:=x;
h[x.x,x.y]:=true;
if (x.x=target.x)and(x.y=target.y) then
begin
writeln(x.step);
outit;
end;
end;
function outq:tnode;
begin
inc(l);
exit(q[l]);
end;
procedure kuo(var node,newnode:tnode;i:longint);
begin
newnode:=node;
inc(newnode.x,dx[i]);
inc(newnode.y,dy[i]);
with newnode do
begin
if (x<1)or(x>n)or(y<1)or(y>n)or(not map[x,y]) then
newnode:=node;
end;
end;
procedure main;
var
node,newnode:tnode;
i:longint;
begin
first.step:=-1;//入队后加 1 为 0
inq(first);
while l<>r do
begin
node:=outq;
for i:=1 to 4 do
begin
kuo(node,newnode,i);
if not h[newnode.x,newnode.y] then inq(newnode);
end;
end;
end;
begin
init;
readdata;
main;
outit;
end.