题目大意
一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安全的。
森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。
有以下几点需要说明:
1、每一分钟画家能向四个方向移动一格(上、下、左、右)
2、每一分钟洪水能蔓延到四个方向的相邻格子(空白区域)
3、洪水和画家都不能通过岩石区域
4、画家不能通过洪水区域(同时也不行,即画家不能移到某个格子,该格子在画家达到的同时被洪水蔓延到了,这也是不允许的)
5、洪水蔓不到画家的住所。
给你森林的地图,编写程序输出最少需要花费多长时间才能从开始的位置赶回家中。
分析
水题+1;
做题时并没有想道可以暴力bfs,又是他*3——olahiuj吱了一声,说是bfs。
然后就轻轻松松的打了一个bfs.
先把洪水会在哪个时间到哪一个点求出来,然后就简单了。
注意,可能有很多初始洪水或者没有洪水(这到是我提醒olahiuj的)
代码
const
dx:array[1..4] of longint=(1,-1,0,0);
dy:array[1..4] of longint=(0,0,1,-1);
var
b:array[0..52,0..52] of longint;
d:array[0..52,0..52] of longint;
x,y:array[0..7000000] of longint;
i,j,k:longint;
n,m:longint;
sx,sy,ex,ey:longint;
ans,num,max:longint;
head,tail:longint;
c:char;
function la(x,y,time:longint):boolean;
begin
la:=true;
if (x>n)or(x<1)or(y>m)or(y<1)
then exit(false);
if d[x,y]<=time
then exit(false);
if (b[x,y]<=time) or (b[x,y]=-1) or (b[x,y]=-2)
then exit(false);
end;
procedure bfs_1;
var
i,j,k:longint;
x1,y1:longint;
begin
head:=0;
if tail=0 then exit;
repeat
head:=head+1;
for i:=1 to 4 do
begin
x1:=x[head]+dx[i];
y1:=y[head]+dy[i];
if la(x1,y1,b[x[head],y[head]]+1)
then
begin
tail:=tail+1;
b[x1,y1]:=b[x[head],y[head]]+1;
x[tail]:=x1; y[tail]:=y1;
num:=num+1;
if num=max then exit;
end;
end;
until tail=head;
end;
procedure bfs_2;
var
i,j,k:longint;
x1,y1:longint;
begin
fillchar(x,sizeof(x),0);
fillchar(y,sizeof(y),0);
tail:=1;
head:=0;
d[sx,sy]:=1;
x[1]:=sx; y[1]:=sy;
repeat
head:=head+1;
for i:=1 to 4 do
begin
x1:=x[head]+dx[i];
y1:=y[head]+dy[i];
if la(x1,y1,d[x[head],y[head]]+1)
then
begin
tail:=tail+1;
d[x1,y1]:=d[x[head],y[head]]+1;
x[tail]:=x1; y[tail]:=y1;
end;
if (x1=ex) and (y1=ey)
then
begin
write(d[x[head],y[head]]);
halt;
end;
end;
until tail=head;
end;
begin
readln(n,m);
tail:=0;
max:=1;
num:=0;
fillchar(b,sizeof(b),$7f);
fillchar(d,sizeof(d),$7f);
for i:=1 to n do
begin
for j:=1 to m do
begin
read(c);
if c='S'
then
begin
sx:=i; sy:=j;
end;
if c='D'
then
begin
ex:=i; ey:=j;
b[i,j]:=-2;
end;
if c='*'
then
begin
tail:=tail+1;
b[i,j]:=1;
x[tail]:=i;
y[tail]:=j;
end;
if c='.'
then
max:=max+1;
if c='X'
then
b[i,j]:=-1;
end;
readln;
end;
bfs_1;
bfs_2;
write('KAKTUS');
end.