鳴人和佐助 計蒜客 - t1214
題意:已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費 11 個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?中文題面就是nice!
解題思路:
bfs:
與常規搜尋不同,可以用三維陣列去儲存乙個點是否訪問過。即
vis[i][j][t]第(i,j)個點在剩餘查克拉為t時是否訪問過
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define ll long long
#define mt(a,b) memset(a,b,sizeof(a))
const
int mod=
10007
;const
int maxn=
1e5+5;
const
int onf=
-0x3f3f3f3f
;const
int inf=
0x3f3f3f3f
;bool vis[
205]
[205][
15];char mp[
205]
[205];
int m,n,t;
int xx=
;int yy=
;struct nodeqwe[maxn<<2]
;ll bfs
(int stx,
int sty)
,head;mt
(vis,
false);
vis[stx]
[sty]
[t]=
true
; tmp.x=stx,tmp.y=sty,tmp.t=t,tmp.step=0;
queueq;
q.push
(tmp)
;while
(!q.
empty()
)if(mp[tx]
[ty]
=='*')if
(mp[tx]
[ty]
=='#')}
}return-1
;}int main (
)
關於dfs,可以用。但是要判斷走到乙個點是否是最短距離,很麻煩,要加很多限制條件。bfs自帶的特性就是第一次走到乙個點,此時走的路程就是最短的路程。 計蒜客 鳴人和佐助 bfs
佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個...
計蒜客 T1214 鳴人和佐助 bfs 佇列
這裡就是在普通bfs上增加了乙個 大蛇丸的手下 打敗乙個手下需要乙個查克拉,但題目限制了查克拉的數量為t 這樣造成的影響就是乙個位置遍歷的次數可能不止一次,因為如果按照沒有手下 時的最短路徑來遍歷的話,所需要的查克拉數量可能不夠,就要找其他路徑。然後就要考慮下一次到達同乙個點時的狀態是否入隊的問題。...
鳴人和佐助
已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費1個單位時間,打敗...