鳴人和佐助 計蒜客 T1214(BFS搜尋)

2021-10-02 07:55:34 字數 1581 閱讀 6520

鳴人和佐助 計蒜客 - 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個單位時間,打敗...