AOJ 866 飛越原野 BFS

2021-07-31 14:08:45 字數 1777 閱讀 7424

在一片廣闊的土地上,有乙個鳥人,他需要從這裡穿過原野,回到基地。這片原野上,有平地(p)、有湖泊(l),因為鳥人可以飛,所以呢,有的時候,他可以飛越湖泊。現在,鳥人需要用最快的時間,回到基地。

假設原野是乙個m*n的矩陣,有兩種地形,用p和l表示。鳥人只能停留在平地上。他目前處在(1,1)這個位置,而目的地是(m,n)。他可以向上下左右四個方向移動,或者飛行。每移動一格需要1個單位時間。而飛行無論飛多遠,都只需要1個單位時間。飛行的途中不可以變方向,也就是說飛行也只能是上下左右四個方向。並且一次飛行最終必須降落在平地上。當然,受到能量的限制,鳥人不能無限制的飛行,他總共最多可以飛行的距離為d。

input

第一行是三個整數,m,n,d,三個數都不超過100,下面是乙個m*n的矩陣,表示原野

output

乙個整數,為最短時間,如果無法到達,則輸出「impossible」

sample input

4 4 2

pllp

pplp

pppp

pllp

sample output

5通過乙個節點,記錄當前的x,y座標,所用時間,剩餘的可飛行距離。

開乙個三維的visit陣列記錄走過的路徑,因為需要額外的維度來記錄剩餘的飛行能力。因為,同樣是到達乙個點,不同的飛行剩餘距離,所得答案有可能不同。

利用bfs進行搜尋。不同的是,一般的bfs只需要列舉4個方向走一步的情況,而這個題則需要多列舉飛行的情況。也就是說,列舉每一種可能,走路,飛行2格、3格···一直到最大剩餘飛行距離。對於每乙個節點都這麼操作。就可以得到答案。

p.s. 手寫佇列比用stl快,但需要將佇列開大一點。(10w不夠,應該是狀態數大於10w。我開50w過了)。

#include

#include

using

namespace

std;

char mp[110][110];

int n,m,d;

bool visit[110][110][110];

typedef

structnode;

const

int maxn=500000;

typedef

structque;

bool check(int x,int y,int d)//判斷能不能到這裡去

que q;

int main()

,,,};

int ans=0;

bool succ=false;

cin>>m>>n>>d;

for(int i=1;i<=m;++i)

for(int j=1;j<=n;++j)

cin>>mp[i][j];

node a;

a.y=a.x=1;

a.d=d;

a.time=0;

q.head=0;

q.tail=0;

q.a[q.tail++]=a;

mp[1][1]='l';

while(q.tail!=q.head)

int dx,dy,dd;

for(int i=0;i<4;++i)

}for(int i=0;i<4;++i)}}

}if(succ)

cout

cout

<<"impossible"

0;}

866 回文素數

求出大於或等於n的最小回文素數。回顧一下,如果乙個數大於 1,且其因數只有 1 和它自身,那麼這個數是素數。例如,2,3,5,7,11 以及 13 是素數。回顧一下,如果乙個數從左往右讀與從右往左讀是一樣的,那麼這個數是回文數。例如,12321 是回文數。示例 1 輸入 6輸出 7示例 2 輸入 8...

AOJ 綜合訓練 2016 11 24

題意分析 分別讀入10個數,按照他給出的格式輸出就行了。注意每有7個字元 包括空格 include int main 題意分析 給出n個數,公升序排序,然後輸出最大的2個就行了。注意氣泡排序寫法。外層迴圈n 1次,記憶體迴圈n i 1次。include define max 10001 int a ...

AOJ 綜合訓練 2016 12 1

題意分析 根據公式,先用含有n的代數式表示出來pi,然後計算這個近似值和題目給出來的3.14159165作差求絕對值,當差值大於1e 5的時候繼續計算,否則就跳出迴圈輸出。有幾點需要注意的,首先做除法預算的時候 題目中的n 要為double型別,如果為int型別的話最後結果為0。還有注意題目中的初始...