1135飛越原野

2021-07-12 03:28:00 字數 1702 閱讀 6550

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 勇敢的德魯伊法里奧出色的完成了任務之後,正在迅速的向自己的基地撤退。但由於後面有著一大群追兵,所以法里奧要盡快地返回基地,否則就會被敵人捉住。終於,法里奧來到了最後一站 泰拉希爾原野,穿過這裡就可以回到基地了。然而,敵人依然緊追不捨。不過,泰拉希爾的地理條件對法里奧十分有利,...