洪水 紀中1235 bfs 水

2021-07-14 18:08:22 字數 3156 閱讀 4420

題目大意

一天,乙個畫家在森林裡寫生,突然爆發了山洪,他需要盡快返回住所中,那裡是安全的。

森林的地圖由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.

洪水 紀中1235 bfs

一天,乙個畫家在森林裡寫生,突然爆發了山洪,他需要盡快返回住所中,那裡是安 全的。森林的地圖由r行c列組成,空白區域用點 表示,洪水的區域用 表示,而 岩石用 x 表示,另畫家的住所用 d 表示,畫家用 s 表示。有以下幾點需要說明 1 每一分鐘畫家能向四個方向移動一格 上 下 左 右 2 每一分鐘...

bfs jzoj1235 洪水 紀中集訓提高B組

ime limits 1000 ms memory limits 65536 kb detailed limits 一天,乙個畫家在森林裡寫生,突然爆發了山洪,他需要盡快返回住所中,那裡是安 全的。森林的地圖由r行c列組成,空白區域用點 表示,洪水的區域用 表示,而 岩石用 x 表示,另畫家的住所用...

跟蹤 紀中4805 bfs

不難發現,石神和兩個陌生人的行動方式一定是最優策略 轉換一下思路,考慮對於每個點,石神是否能比兩個陌生人先到達 計算石神到達每個點的最早時間,以及兩個陌生人到達每個點的最早時間 然後對於每個點依次判斷是不是可能是最終被追上的位置即可,最遲時間也可以方便求得 這裡膜一下梓豪 include inclu...