JZOJ 4 1 C組 飛越原野 bfs

2021-07-29 22:49:07 字數 2542 閱讀 5441

description

勇敢的德魯伊法里奧出色的完成了任務之後,正在迅速的向自己的基地撤退。但由於後面有著一大群追兵,所以法里奧要盡快地返回基地,否則就會被敵人捉住。

終於,法里奧來到了最後一站:泰拉希爾原野,穿過這裡就可以回到基地了。然而,敵人依然緊追不捨。不過,泰拉希爾的地理條件對法里奧十分有利,眾多的湖泊隨處分布。敵人需要繞道而行,但法里奧擁有變成鷹的特殊能力,使得他能輕輕鬆鬆的飛越湖面。當然,為了保證安全起見,法里奧還是決定找一條能最快回到基地的路。

假設泰拉希爾原野是乙個m*n的矩陣,它有兩種地形,p表示平地,l表示湖泊,法里奧只能停留在平地上。他目前的位置在左上角(1,1)處,而目的地為右下角的(m,n)。法里奧可以向前後左右四個方向移動或者飛行,每移動一格需要1單位時間。而飛行的時間主要花費在變形上,飛行本身時間消耗很短,所以無論一次飛行多遠的距離,都只需要1單位時間。飛行的途中不能變向,並且一次飛行最終必須要降落在平地上。當然,由於受到能量的限制,法里奧不能無限制的飛行,他總共最多可以飛行的距離為d。在知道了以上的資訊之後,請你幫助他計算一下,他最快到達基地所需要的時間。

input

第一行是3個正整數,m(1<=m<=100),n(1<=n<=100),d(1<=d<=100)。表示原野是m*n的矩陣,法里奧最多只能飛行的距離是d。

接下來的m行每行有n個字元,相互之間沒有空格。p表示當前位置為平地,l則表示湖泊。 (1,1)和(m,n)一定是平地。

output

乙個整數,表示法里奧到達基地需要的最短時間。如果無法到達基地,則輸出impossible。

sample input

4 4 2

pllp

pplp

pppp

pllp

sample output

這只是一道純bfs

列舉向四個方向或飛行

用x,y求出如果進行這次飛行的到達的地方

找到到這個地方所用的飛行距離——r

判斷有沒有出方陣/到達的地方是否為土地/是否搜過。如果都符合,就入隊。

**如下:

uses math;

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

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

dz:array[1..4]of longint=(2,1,4,3);

var n,m,z,i,j,head,tail,x,y,r:longint;

k:array[0..101,0..101]of longint;

c:char;

state:array[0..1000010,1..2]of longint;

d,time,s:array[0..1000010]of longint;

v:array[0..101,0..101,0..101]of boolean;

begin

readln(n,m,z);

fillchar(v,sizeof(v),false);

for i:=1

to n do

begin

for j:=1

to m do

begin

read(c);

if c='p'

then k[i,j]:=1

else k[i,j]:=0;

end;

readln;

end;

state[1,1]:=1;

state[1,2]:=1;

d[1]:=z;

head:=0;

tail:=1;

repeat

inc(head);

for i:=1to4

dofor j:=1

to d[head] do

begin

x:=state[head,1]+dx[i]*j;

y:=state[head,2]+dy[i]*j;

if (x<1)or(x>n)or(y<1)or(y>m) then

break;

if j<>1

then

r:=max(1,d[head]-j)

else r:=d[head];

if (k[x,y]=0)or(v[x,y,r]=true)or(s[head]=i) then

continue;

if (x=n)and(y=m) then

begin

writeln(time[head]+1);

exit;

end;

inc(tail);

state[tail,1]:=x;

state[tail,2]:=y;

s[tail]:=dz[i];

d[tail]:=r;

time[tail]:=time[head]+1;

v[x,y,r]:=true;

end;

until head>=tail;

writeln('impossible');

end.

JZOJ 4 1 B組 無限序列

description 我們按以下方式產生序列 1 開始時序列是 1 2 每一次變化把序列中的 1 變成 10 0 變成 1 經過無限次變化,我們得到序列 1011010110110101101 總共有 q 個詢問,每次詢問為 在區間a和b之間有多少個1。任務 寫乙個程式回答q個詢問 input 第...

JZOJ 4 1 B組 無限序列

description 我們按以下方式產生序列 1 開始時序列是 1 2 每一次變化把序列中的 1 變成 10 0 變成 1 經過無限次變化,我們得到序列 1011010110110101101 總共有 q 個詢問,每次詢問為 在區間a和b之間有多少個1。任務 寫乙個程式回答q個詢問 input 第...

JZOJ8 15(C組)電話時間

題目 某人總是花很多時間給父母打 有一次他記錄了打 的開始時間和結束時刻t1和t2,請你幫他算算此次通話一共用了多少秒。又有一次,他記錄了打 的開始時刻t1和通話的時間長度len,請你幫他計算他在什麼時刻結束通話。已知每次通話時間小於24個小時。分析 純模擬啦。附上 vart,q longint h...