佐助和鳴人

2022-03-31 19:41:23 字數 1537 閱讀 4487

描述   

已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費1個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?

輸入輸入的第一行包含三個整數:m,n,t。代表m行n列的地圖和鳴人初始的查克拉數量t。0 < m,n < 200,0 ≤ t < 10

後面是m行n列的地圖,其中@代表鳴人,+代表佐助。*代表通路,#代表大蛇丸的手下。

輸出輸出包含乙個整數r,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。

樣例輸入1

4 4 1

#@##

**##

###+

****

樣例輸入2

4 4 2

#@##

**##

###+

****

樣例輸出1

6樣例輸出2

4

#includeusing

namespace

std;

#define max 10

int r, c, t; //

int maze[max][max]; //

地圖;struct

node

node(

int rr, int cc,int nn, int

s) :r(rr), c(cc),n(nn), steps(s)

};node open[max*max]; //

open表;

int head = 0

;int tail = 0; //

頭尾指標;

node start, goal;//

鳴人的起始地點;

int visited[max][max][max]; //

標記走過的狀態;

int dir[4][2] = ; //

方向;int

main()

if (tmp == '#'

)

if (tmp == '*'

)

if (tmp == '+'

) }

memset(visited,

0, sizeof

(visited));

open[tail++] =start;

visited[start.r][start.c][start.n] = 1

;

while (head for (int i = 0; i < 4; i++) }}

return0;

}

鳴人與佐助 bfs

原 廣度搜尋 比較麻煩的地方是加了乙個查克拉,用book陣列標記的時候將查克拉加上就ok 記得當時做的時候廢了好長時間 兩種方法,不多bb ac 三維陣列標記的 include include struct node q 40002 int m,n,ck,sx,sy char map 202 202...

bfs 鳴人與佐助

發現了沒有這題包括之前的題目在廣搜裡面都涉及到了狀態這個詞。而狀態裡面的變數是會隨著廣搜的過程和題目的限制發生相應的變化的。比如上一題的迷宮問題狀態中就有x與y座標和父節點這幾個引數。這一題由於多了乙個查克拉的限制所以在狀態中加上查克拉。題解 這道題用bfs來做。1 由於每一層加的時間是一樣的,所以...

鳴人和佐助

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