洪水 紀中1235 bfs

2021-07-14 18:08:22 字數 3042 閱讀 6929

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

全的。

森林的地圖由r行c列組成,空白區域用點「.」表示,洪水的區域用「*」表示,而

岩石用「x」表示,另畫家的住所用「d」表示,畫家用「s」表示。

有以下幾點需要說明:

1、 每一分鐘畫家能向四個方向移動一格(上、下、左、右)

2、 每一分鐘洪水能蔓延到四個方向的相鄰格仔(空白區域)

3、 洪水和畫家都不能通過岩石區域

4、 畫家不能通過洪水區域(同時也不行,即畫家不能移到某個格仔,該格仔在畫家達到的同時被洪水蔓延到了,這也是不允許的)

5、 洪水蔓不到畫家的住所。

給你森林的地圖,編寫程式輸出最少需要花費多長時間才能從開始的位置趕回家中。

輸入第一行包含兩個整數r和c(r,c<=50)。

接下來r行每行包含c個字元(「.」、「*」、「x」、「d」或「s」)。地圖保證只有乙個「d」和乙個「s」。

輸出畫家最快安全到達住所所需的時間,如果畫家不可能安全回家則輸出「kaktus」。

3 3

d.*

.s.

3 3

d.*

..s3 6

d…*.

.x.x..

….s.

kaktus

昨天晚上的專題就是暴力搜尋,於是乎就想到了搜尋

記錄洪水和畫家的位置分別bfs兩次,記錄當前點的深度dep[i,j]

若同一位置,畫家的深度》=洪水的深度就kaktus,否則輸出到達房子時的深度

type

axis=record

x,y,w:longint;

end;

state=record

head,tail:longint;

s:array[1..3000]of axis;

end;

const

dx:array[1..4]of integer=(-1,1,0,0);

dy:array[1..4]of integer=(0,0,-1,1);

var n,m:longint;

map,t,g:array[-1..100,-1..100]of longint;

sop,fop:axis;

a,b:state;

procedure

bfs;

var i,x,y:longint;

begin

t[fop.x,fop.y]:=maxlongint;

repeat

inc(b.head);

for i:=1to4

dobegin

x:=b.s[b.head].x+dx[i];

y:=b.s[b.head].y+dy[i];

if (map[x,y]=1)and(t[x,y]=0) then

begin

inc(b.tail);

b.s[b.tail].x:=x;

b.s[b.tail].y:=y;

b.s[b.tail].w:=b.s[b.head].w+1;

t[x,y]:=b.s[b.tail].w;

end;

end;

until b.head>=b.tail;

fillchar(a,sizeof(a),0);

a.tail:=1;

a.s[1]:=sop;

repeat;

inc(a.head);

if map[a.s[a.head].x,a.s[a.head].y]=2

then

begin

writeln(a.s[a.head].w);

halt;

end;

for i:=1to4

dobegin

x:=a.s[a.head].x+dx[i];

y:=a.s[a.head].y+dy[i];

if (map[x,y]in[1,2])and((t[x,y]>a.s[a.head].w+1)or(t[x,y]=0))and(g[x,y]=0) then

begin

inc(a.tail);

a.s[a.tail].x:=x;

a.s[a.tail].y:=y;

a.s[a.tail].w:=a.s[a.head].w+1;

g[x,y]:=a.s[a.tail].w;

end;

end;

until a.head>=a.tail;

end;

procedure

init;

var i,j:longint;

c:char;

begin

fillchar(map,sizeof(map),0);

readln(n,m);

for i:=1

to n do

begin

for j:=1

to m do

begin

read(c);

if c='x'

then map[i,j]:=0;

if c='.'

then map[i,j]:=1;

if c='d'

then map[i,j]:=2;

if c='s'

then

begin

map[i,j]:=3;

sop.x:=i;

sop.y:=j;

end;

if c='*'

then

begin

map[i,j]:=4;

inc(b.tail);

b.s[b.tail].x:=i;

b.s[b.tail].y:=j;

end;

end;

readln;

end;

end;

begin

init;

bfs;

writeln('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 表示,另畫家的住所用...

2019紀中培訓

2019.01.22 noip普及組 模擬賽c組 在紀中的第一套題 為什麼是xp?我好水四道題三道dp 2019.01.23 noip普及組 模擬賽c組 換到了科學樓,有windows 7真好 有點強大 比賽結束之後,沒有乙個人把第三道題a了 聽到巨佬講規律,心裡懵逼的一批 晚上還有北大老師講課 2...