003 鳴人和佐助

2021-10-05 10:53:49 字數 1859 閱讀 5156

描述

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

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

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

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

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

樣例輸入

樣例輸入144

1#@##

**##

###+**

**樣例輸入244

2#@##

**##

###+**

**

樣例輸出

樣例輸出1

6樣例輸出2

4

bfs的解法:

/*注意這裡是三種狀態,x,y,t因為查克拉的數量也要記錄

我開始單純地記錄座標,wa。

想想也不難理解,乙個座標可能由不同座標拓展,而乙個座標的查克拉數量會決定該結點是否可以拓展

舉個例子,乙個點可能被a點拓展,查克拉數量是1,被b拓展,查克拉數量是2,那麼該點通過b就可能成功,

但如果先被a拓展,直接被標記為訪問,那就不會被b拓展,這樣可能會導致無解。所以要記錄三種狀態

*/#include

#include

#include

#include

using

namespace std;

int m,n,t;

char matrix[

205]

[205];

bool vis[

205]

[205][

20];int dis[4]

[2]=

,,,}

;struct status

status

(int _x,

int _y,

int _cnt,

int _cost):x

(_x),y

(_y)

,cnt

(_cnt)

,cost

(_cost)};

int sx,sy;

//起點座標

int ex,ey;

//終點座標

queue q;

void

init()

else

if(matrix[i]

[j]==

'+')}}

q.push

(status

(sx,sy,t,0)

);vis[sx]

[sy]

[t]=1;

}bool

judge

(int x,

int y)

//是否越界

intbfs()

for(

int i =

0; i<4;

++i)}}

q.pop();

}return1;

}int

main()

鳴人和佐助

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

4115 鳴人和佐助

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

NOI OJ 6044 鳴人和佐助

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