百練4115 鳴人和佐助(變式BFS)

2021-07-16 03:45:32 字數 1888 閱讀 4009

總時間限制: 1000ms 記憶體限制: 65536kb

描述 佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?

已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費1個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?

輸入 輸入的第一行包含三個整數:m,n,t。代表m行n列的地圖和鳴人初始的查克拉數量t。0 < m,n < 200,0 ≤ t < 10

後面是m行n列的地圖,其中@代表鳴人,+代表佐助。*代表通路,#代表大蛇丸的手下。

輸出 輸出包含乙個整數r,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。

樣例輸入

樣例輸入1

輸入顯示不出來,大家看原題吧。

樣例輸入2

樣例輸出

樣例輸出1

6樣例輸出2

4題解:

這道題用bfs來做。

1、由於每一層加的時間是一樣的,所以最先遇到佐助的路徑一定是最優路徑,所以遇到佐助就要停下來,就出答案了。

2、然而這道題有煩人的查克拉問題,可能最短路會由於全是守衛,所以查克拉不夠用,必須要繞路才能走過去,所以不能按照普通的bfs一樣用乙個vis陣列,這道題裡面的每個節點的數值可能是要更新的。

3、然而肯定要有個東西作為不能繼續進行下去的剪枝,不然會一直更新原來的節點,程式必然會tle,所以,用乙個maxk陣列來剪枝,maxk陣列儲存如果要到這個節點所剩查克拉的最多是多少,如果後面又擴充套件出這個節點,那時間一定會大於等於上次擴充套件出這個節點,這時候,如果此時的所剩查克拉數還少於上一次所剩,那麼肯定不是最優解,剪枝。

4、由於各個節點的值要更新,而且更新是否正確根據能否走到為判斷標準,所以不如把需要更新的值寫入結構體,壓入佇列時就一併算是更新了。

思考:

1、1個狀態不夠就2個狀態,2個不夠3個,3個不夠4個,總有一種會夠。

2、太弱太弱太弱

3、套路?儲存乙個到達這個節點所需要的**值的最大/最小值,結構體中儲存把這個節點處理完了以後的值。(我其實也迷迷糊糊,看不懂自己寫的這句看似是套路的東西)

4、太弱太弱太弱

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

struct point

};const

int maxn = 205;

const

int inf = 1

<< 30;

char maze[maxn][maxn];

int answer, dir[4][2] = , , , };

int maxk[maxn][maxn];//到達這個格仔還剩查克拉最大值

int m, n, t;

queue

q;void bfs()

else

} else }}

}}int main()}}

answer = inf;

bfs ();

if (answer == inf) else

return

0;}

4115 鳴人和佐助

總時間限制 1000ms 記憶體限制 65536kb 描述佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的...

POJ 4115 鳴人和佐助

總時間限制 1000ms 記憶體限制 65536kb 描述 佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位...

鳴人和佐助

已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費1個單位時間,打敗...