總時間限制: 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個單位時間,打敗...