6044 鳴人和佐助 (深度優先演算法)

2021-08-25 05:49:06 字數 1760 閱讀 9260

總時間限制: 1000ms 記憶體限制: 65536kb

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

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

#include

#include

using

namespace

std;

int m,n,t;

int starti, startj, endi, endj;

char maze[210][210];

int mintime;

int totaltime ;

int cost[210][210][10];

int dir[4][2] = ,,, };

bool visited[210][210];

void dfs(int i,int j,int life)

for (int k = 0;k < 4;k++ )

if(maze[row][col] == '*'||maze[row][col] == '+' && life >= 0)}}

}}int main()

if(maze[i][j] == '+')

}

memset(visited,0,sizeof(visited));//初始化,都沒有訪問過

totaltime = 0;

mintime = 1

<< 30;//乙個較大的數

for(int i = 0;i < m;++i)

for(int j = 0;j for (int k = 0;k < 10;++k)

cost[i][j][k] = 1

<< 30;//初始,置成較大的數

visited[starti][startj] = 1;//開始搜尋

dfs(starti,startj,t) ;

if (mintime < 1

<< 30)

else

return

0;}

這裡**可以進一步寫的簡練些。

NOI OJ 6044 鳴人和佐助

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

NOI OJ 6044 鳴人和佐助

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

鳴人和佐助(OJ 6044)

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