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

2021-10-07 21:24:21 字數 3103 閱讀 2172

題目鏈結

題目:佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?

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

輸入格式

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

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

sample input

4 4 1

#@##

**##

###+

****

sample output

sample input 2

4 4 2

#@##

**##

###+

****

sample output 2

這是一道廣度優先搜尋題,與傳統的bfs題相比這個題多了乙個查克拉數字,原本認為只需要在結構體裡多宣告乙個變數就可以了,但是發現這樣並不能解題。

如果從不同點出發到達同一點,而他們兩次到達時所攜帶的查克拉數不同,就會出現第二次無法到達該點的情況,但因為走的路不同攜帶的查克拉數不同,那麼這到達目的地的步數也會不同。

這裡我們用三維陣列解決這個問題,三維陣列,前兩維是橫縱座標,第三維是查克拉數這樣通過同一點時攜帶的查克拉數字不同也能將點加入佇列。

**如下:

#include

using

namespace std;

struct muban

que[

50000];

char imap[

205]

[205];

int book[

205]

[205][

15];//三維陣列,第三個維度記錄查克拉數

int next[4]

[2]=

,,,}

;int

main()

if(imap[i]

[j]==

'+')}}

int head,tail,tx,ty;

head=1;

que[head]

.x=stax;

que[head]

.y=stay;

que[head]

.step=0;

que[head]

.num=t;

book[stax]

[stay]

[t]=1;

tail=2;

int minstep=

99999

;while

(head

else

if(imap[tx]

[ty]

=='#'

&&que[head]

.num>=

1&&book[tx]

[ty]

[que[head]

.num-1]

==0)//如果該點有大蛇丸的手下並且攜帶的查克拉數大於1 }if

(que[tail-1]

.x==endx&&que[tail-1]

.y==endy)

} head++;}

if(minstep==

99999

) cout<<

"-1"

<

else

cout<

return0;

}

用佇列queue解題**:

#include

using

namespace std;

struct muban

;char a[

202]

[202];

int book[

202]

[202][

11];int n,m,t,stax,stay,endx,endy;

int next[4]

[2]=

,,,}

;int

main()

else

if(a[i]

[j]==

'+')}}

queue q;

struct muban e,u;

e.x=stax;

e.y=stay;

e.num=t;

e.step=0;

q.push

(e);

int min=

99999

;while

(q.size()

)else

if(a[u.x]

[u.y]

=='#'

&&e.num>=

1&&book[u.x]

[u.y]

[e.num-1]

==0)}

if(q.

back()

.x==endx&&q.

back()

.y==endy)}}

} cout<

<

return0;

}

中間出現編譯報錯[error] ld returned 1 exit status,原因是我沒有把之前開啟的終端關閉,我一開始還以為是我編譯錯誤…

在網上查了出現此類報錯還可能的錯誤裡面還有

1、事先宣告的函式與實現(implementation)的函式名不相同

2、在c++類中定義了static 資料型別沒有初始化

還有我前幾次提交都報錯memory limit exceeded,是因為我標記book事把=號打成==了。

計蒜客 鳴人和佐助 bfs

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

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

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

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

這裡就是在普通bfs上增加了乙個 大蛇丸的手下 打敗乙個手下需要乙個查克拉,但題目限制了查克拉的數量為t 這樣造成的影響就是乙個位置遍歷的次數可能不止一次,因為如果按照沒有手下 時的最短路徑來遍歷的話,所需要的查克拉數量可能不夠,就要找其他路徑。然後就要考慮下一次到達同乙個點時的狀態是否入隊的問題。...