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...