總時間限制: 1000ms 記憶體限制: 65536kb
描述 佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?
已知一張地圖(以二維矩陣的形式表示)以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費1個單位時間,打敗大蛇丸的手下不需要時間。如果鳴人查克拉消耗完了,則只可以走到沒有大蛇丸手下的位置,不可以再移動到有大蛇丸手下的位置。佐助在此期間不移動,大蛇丸的手下也不移動。請問,鳴人要追上佐助最少需要花費多少時間?
輸入 輸入的第一行包含三個整數:m,n,t。代表m行n列的地圖和鳴人初始的查克拉數量t。0 < m,n < 200,0 ≤ t < 10
後面是m行n列的地圖,其中@代表鳴人,+代表佐助。*代表通路,#代表大蛇丸的手下。
輸出 輸出包含乙個整數r,代表鳴人追上佐助最少需要花費的時間。如果鳴人無法追上佐助,則輸出-1。
樣例輸入
樣例輸出
樣例輸出1
6樣例輸出2
4很有意思的題目。
bfs,用狀態記錄下每一步的查克拉數量。
while
true:
try:
m, n, t = input().split()
m = int(m); n = int(n); t = int(t)
grid=
r, c = 0, 0
for i in range(m):
if'@'in grid[i]:
r, c = i, grid[i].index('@')
queue =
visited = [[[0
for i in range(20)] for j in range(n)] for k in range(m)]
directions = [[-1, 0], [1, 0], [0, 1], [0, -1]]
visited[r][c][t] = 1
found = false
while len(queue):
if found:
break
tmp = queue[0]
queue.pop(0)
if grid[tmp[0]][tmp[1]] == '+':
found = true
print(tmp[3])
break
for direction in directions:
new_r = tmp[0] + direction[0]
new_c = tmp[1] + direction[1]
if new_r >= 0
and new_r < m and new_c >= 0
and new_c < n:
if grid[new_r][new_c] == '*'
andnot visited[new_r][new_c][tmp[2]]:
visited[new_r][new_c][tmp[2]] = 1
elif grid[new_r][new_c] == '#'
and tmp[2] > 0
andnot visited[new_r][new_c][tmp[2] - 1]:
visited[new_r][new_c][tmp[2] - 1] = 1
elif grid[new_r][new_c] == '+':
found = true
print(tmp[3] + 1)
break
ifnot found:
print(-1)
except:
break
4115 鳴人和佐助
總時間限制 1000ms 記憶體限制 65536kb 描述佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的...
poj 4115 鳴人和佐助(bfs特殊判重)
總時間限制 1000ms 記憶體限制 65536kb 描述佐助被大蛇丸誘騙走了,鳴人在多少時間內能追上他呢?已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的...
鳴人和佐助
已知一張地圖 以二維矩陣的形式表示 以及佐助和鳴人的位置。地圖上的每個位置都可以走到,只不過有些位置上有大蛇丸的手下,需要先打敗大蛇丸的手下才能到這些位置。鳴人有一定數量的查克拉,每乙個單位的查克拉可以打敗乙個大蛇丸的手下。假設鳴人可以往上下左右四個方向移動,每移動乙個距離需要花費1個單位時間,打敗...