計蒜客 T1214 鳴人和佐助 bfs 佇列

2021-10-23 01:26:18 字數 1451 閱讀 4081

這裡就是在普通bfs上增加了乙個——大蛇丸的手下『#』,打敗乙個手下需要乙個查克拉,但題目限制了查克拉的數量為t

這樣造成的影響就是乙個位置遍歷的次數可能不止一次,因為如果按照沒有手下『#』時的最短路徑來遍歷的話,所需要的查克拉數量可能不夠,就要找其他路徑。

然後就要考慮下一次到達同乙個點時的狀態是否入隊的問題。容易想到的是如果第二次到達乙個位置時的,時間比上一次的多and查克拉數量比上一次的少,這個狀態就不用入隊了。考慮到每次移動的時間相同並且打敗乙個手下不需要花費時間,所以後面到達相同的位置時,時間肯定是大於第一次到達這個位置的時間。所以只用考慮排除查克拉數量比上一次少的情況

如下圖,按路徑ddrr到達+,是要比路徑rrdd到達+的狀態更優的

**:

//因為沒走一步的時間都一樣且打敗手下不需要花費時間,所以可以不用優先佇列對時間排序

//numk[i][j]維護點到達點(i,j)是查克拉的最大數目

//ps:開始想該不該用查克拉的時候就被題嚇到了aaaaaaaa

#include

#include

#include

#include

#include

//#define int long long

using namespace std;

const

int inf=

0x3f3f3f3f

;const

int manx=

210;

int mp[manx]

[manx]

,times[manx]

[manx]

,numk[manx]

[manx]

;int n,m,k,x1,yy1,x2,y2,flag,mmax;

char str[manx]

;int dx=

;int dy=

;struct node*/}

;int

check

(int x,

int y,

int k)

void

bfs(

) queuequ;

numk[x1]

[yy1]

=k; qu.

push

(node);

while

(!qu.

empty()

) qu.

push

(net);}

}}}void

init()

intmain()

}bfs()

;if(flag)

printf

("%d\n"

,mmax)

;else

printf

("-1\n");

return0;

}

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

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

計蒜客 鳴人和佐助 bfs

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

鳴人和佐助 計蒜客 1214 廣搜 三維陣列

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