一天, 乙個畫家在森林裡寫生,突然爆發了山洪,他需要盡快返回住所中,那裡是安
全的。
森林的地圖由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...