0910 OpenJ 6044 鳴人和佐助

2021-08-08 01:14:25 字數 1796 閱讀 9285

摘要

-使用bfs來尋找最短的可行路徑

原題目摘要

-鳴人和佐助-

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

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

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

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

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

樣例輸入

樣例輸入

14 4 1

#@##**

#####+

****

樣例輸入2

4 4 2

#@##**

#####+

****

樣例輸出

樣例輸出16樣例輸出24

題目理解

-設定每個位置查克拉的數量不同為不同的狀態,用三維陣列標記。然後開始bfs。類似的最路徑問題如果需要記錄路徑的話  要用於狀態數相同的對應陣列儲存當前位置狀態的**。找到目的狀態後,用乙個棧就可以向回訪問到起點。輸出棧記為路徑。

注意

-剛開始沒有注意到到乙個點可以有多種途徑。查克拉成為了乙個狀態的附加狀態。因此只能將同乙個點不同的查克拉數作為乙個狀態

日期

-2017 9 10

附加

-**

-#include #include #include #include #include #include #include #include using namespace std;

#define max 205

struct node

node(int _x,int _y,int _t,int _s):x(_x),y(_y),t(_t),step(_s){}

};bool vis[max][max][11];//is vis?

char m[max][max];

int m,n,t;

queue< node > q;

bool check(int x,int y)}}

}void solve(int bx,int by)

while(!q.empty())

dis();

q.pop();

}printf("-1");

}void get_in(){

bool state = false;

scanf("%d%d%d",&m,&n,&t);

int bx,by;

for(int i=0;i

NOI OJ 6044 鳴人和佐助

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

NOI OJ 6044 鳴人和佐助

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

鳴人和佐助(OJ 6044)

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