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