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。
解題思路:使用廣度搜尋演算法解決該問題。下面的演算法參考了網上他人演算法。首先建立乙個結構體node,用於儲存狀態,結構體node的狀態包括所在的位置x,y以及還能飛的距離p。從起點出發,將起點狀態x=0,y=0,p=d壓入deque。然後逐個取出deque中的首元素,對該元素進行四周搜尋,尋找下一種合適的狀態,將其壓入deque中。使用3維矩陣來記錄狀態點是否出現過。
#include #include #include #include using namespace std;
struct node;
char graph[120][120];
bool visited[120][120][120];
int m, n, d;
int mov[4][2] = ,,,};
dequeq;
bool can_vis(int x, int y, int p)
else return false;
}int main() {
// insert code here...
int i,j,size;
node tmp, tmp1;
int result, flag;
while (scanf("%d",&m)!=eof) {
scanf("%d%d", &n,&d);
for(i = 0; i
1135 飛越原野
典型的bfs題,每步分為兩種mode,用三維陣列記錄兩種mode所能到達點的狀態,避免無意義的計算,其中許多程式設計技巧值得學習。為什麼出來的一定是最少的時間呢?這是因為飛行mode與行走mode對ans的增益在每步當中都是一樣的。學習建構函式的利用。include include include ...
AOJ 866 飛越原野 BFS
在一片廣闊的土地上,有乙個鳥人,他需要從這裡穿過原野,回到基地。這片原野上,有平地 p 有湖泊 l 因為鳥人可以飛,所以呢,有的時候,他可以飛越湖泊。現在,鳥人需要用最快的時間,回到基地。假設原野是乙個m n的矩陣,有兩種地形,用p和l表示。鳥人只能停留在平地上。他目前處在 1,1 這個位置,而目的...
JZOJ 4 1 C組 飛越原野 bfs
description 勇敢的德魯伊法里奧出色的完成了任務之後,正在迅速的向自己的基地撤退。但由於後面有著一大群追兵,所以法里奧要盡快地返回基地,否則就會被敵人捉住。終於,法里奧來到了最後一站 泰拉希爾原野,穿過這裡就可以回到基地了。然而,敵人依然緊追不捨。不過,泰拉希爾的地理條件對法里奧十分有利,...