鳴人和佐助(OJ 6044)

2022-05-12 23:59:45 字數 1696 閱讀 4378

描述

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

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

作為我初學迭代深搜的開端,這算是比較具有代表性的題目。本也不會做,因為 malcolmmeng 大佬,啟發了我的迭代思想。

迭代條件:

1. 不越界,不重複訪問

2. 走到這一步,查克拉不能為負(否則根本走不到這一步)

3. 走到這一步的步數不能大於我已得到的到達終點的最少步數(不然再走也沒意義了,現在還沒走到,到了也超了,直接減掉)

4. 走到當前位置消耗一定的查克拉時,所走的步數不能比以前走的多(肯定是繞路了)

5. 遇到佐助,當前的步數要比曾到過時的步數少(才是ans)

標記當前位置走過,再「四向遍歷」 ,返回時標記取消(假裝沒走過)

**如下:

#include#include

#include

using

namespace

std;

const

int inf=0x3f3f3f3f

;int n,m,sx,sy,st,minstep=inf;

int step[201][201][11],dx=,dy=;

char mp[201][201

];bool vis[201][201

];void dfs(int x,int y,int t,int

stp)

vis[x][y]=1

;

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

vis[x][y]=0;}

intmain()

}getchar();

}memset(step,

0x3f,sizeof

(step));

dfs(sx,sy,st,0);

if(minstep==inf) printf("-1"

);

else printf("%d"

,minstep);

return0;

}

NOI OJ 6044 鳴人和佐助

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

NOI OJ 6044 鳴人和佐助

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

0910 OpenJ 6044 鳴人和佐助

摘要 使用bfs來尋找最短的可行路徑 原題目摘要 鳴人和佐助 佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單...