發現了沒有這題包括之前的題目在廣搜裡面都涉及到了狀態這個詞。而狀態裡面的變數是會隨著廣搜的過程和題目的限制發生相應的變化的。比如上一題的迷宮問題狀態中就有x與y座標和父節點這幾個引數。這一題由於多了乙個查克拉的限制所以在狀態中加上查克拉。
題解:這道題用bfs來做。
1、由於每一層加的時間是一樣的,所以最先遇到佐助的路徑一定是最優路徑,所以遇到佐助就要停下來,就出答案了。
2、然而這道題有煩人的查克拉問題,可能最短路會由於全是守衛,所以查克拉不夠用,必須要繞路才能走過去,所以不能按照普通的bfs一樣用乙個vis陣列,這道題裡面的每個節點的數值可能是要更新的。
3、然而肯定要有個東西作為不能繼續進行下去的剪枝,不然會一直更新原來的節點,程式必然會tle,所以,用乙個maxk陣列來剪枝,maxk陣列儲存如果要到這個節點所剩查克拉的最多是多少,如果後面又擴充套件出這個節點,那時間一定會大於等於上次擴充套件出這個節點,這時候,如果此時的所剩查克拉數還少於上一次所剩,那麼肯定不是最優解,剪枝。
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];//
到達這個格仔還剩查克拉最大值
intm, n, t;
queue
q;void
bfs()
else
} else}}
}}int
main()}}
answer =inf;
bfs ();
if (answer ==inf)
else
return0;
}
鳴人與佐助 bfs
原 廣度搜尋 比較麻煩的地方是加了乙個查克拉,用book陣列標記的時候將查克拉加上就ok 記得當時做的時候廢了好長時間 兩種方法,不多bb ac 三維陣列標記的 include include struct node q 40002 int m,n,ck,sx,sy char map 202 202...
DFS 剪枝 BFS 鳴人和佐助
佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個...
鳴人和佐助
已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費1個單位時間,打敗...