sdutoj 1124 飛躍原野(BFS)

2021-09-29 04:57:10 字數 1900 閱讀 4277

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

終於,法里奧來到了最後的一站:泰拉希爾原野,穿過這裡就可以回到基地了。然而,敵人依然緊追不捨。不過,泰拉希爾的地理條件對法里奧十分有利,眾多的湖泊隨處分布。敵人需要繞道而行,但法里奧還是決定找一條能盡快回到基地的路。

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

第一行是3個整數,m(1≤m≤100),n(1≤n≤100),d(1≤d≤100)。表示原野是m*n的矩陣,法里奧最多只能飛行距離為d。接下來的m行每行有n個字元,相互之間沒有空格。p表示當前位置是平地,l則表示湖泊。假定(1,1)和(m,n)一定是平地。

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

442

pllp

pplp

pppp

pllp

5
節點記錄狀態,那都需要儲存什麼資訊呢?記錄當前的x,y座標,所用時間,剩餘的可飛行距離

判重和一般的bfs不同,開乙個三維的陣列bool inq[105][105][105];記錄走過的路徑,因為需要額外的維度來記錄剩餘的飛行能力。因為,同樣是到達乙個點,不同的飛行剩餘距離,所得答案有可能不同。

利用bfs進行搜尋,和一般的bfs不同的是,每乙個結點擴充套件出來的孩子結點既有行走的,也有飛行的。所以,既需要列舉4個方向走一步的情況,也需要列舉朝4個方向飛行2格、3格···一直到最大剩餘飛行距離。

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int mod =

10000007

;const

int inf =

0x3f3f3f3f

;const

double pi =

acos(-

1.0)

;const

int maxn =

300;

int n,m,d;

char a[

105]

[105];

bool inq[

105]

[105][

105]

;int x[4]

=;int y[4]

=;struct node start, top, tmp;

bool

judge

(int x,

int y,

int dis)

intbfs()

}for

(int j =

2; j <= top.dis; j++

)//向四個方向飛行j格,兩格、三格……最大直到剩餘可飛行的距離}}

}return-1

;}intmain()

1124 矩陣加法

時間限制 1000 ms 記憶體限制 65536 kb 提交數 7242 通過數 4800 輸入兩個n行m列的矩陣a和b,輸出它們的和a b。第一行包含兩個整數n和m,表示矩陣的行數和列數 1 n 100,1 m 100 接下來n行,每行m個整數,表示矩陣a的元素。接下來n行,每行m個整數,表示矩陣...

1124 矩陣加法

時間限制 1000 ms 記憶體限制 65536 kb 題目描述 輸入兩個n行m列的矩陣a和b,輸出它們的和a b。輸入 第一行包含兩個整數n和m,表示矩陣的行數和列數 1 n 100,1 m 100 接下來n行,每行m個整數,表示矩陣a的元素。接下來n行,每行m個整數,表示矩陣b的元素。相鄰兩個整...

1124 矩陣加法

輸入兩個n行m列的矩陣a和b,輸出它們的和a b。第一行包含兩個整數n和m,表示矩陣的行數和列數 1 n 100,1 m 100 接下來n行,每行m個整數,表示矩陣a的元素。接下來n行,每行m個整數,表示矩陣b的元素。相鄰兩個整數之間用單個空格隔開,每個元素均在1 1000之間。n行,每行m個整數,...