第10回日本情報オリンピック E - チーズ
https://atcoder.jp/contests/joi2011yo/tasks/joi2011yo_e
提出
WA
code: python
from collections import deque
from copy import deepcopy
h, w, n = map(int, input().split())
area = list(input()) for _ in range(h)
visited = list(0 for _ in range(w)) for _ in range(h)
for y in range(h):
for x in range(w):
if (areayx == "S"):
start = y, x
def goal(num):
for y in range(h):
for x in range(w):
if areayx == str(num):
return y, x
def bfs(start, goal, que):
visited_c = deepcopy(visited)
que.append(start)
while (len(que) != 0):
nowY, nowX, dis = que.popleft()
if (nowX < 0 or nowX >= w or nowY < 0 or nowY >= h):
continue
if (areanowYnowX == "#" or visited_cnowYnowX != 0):
continue
else:
visited_cnowYnowX += dis
dis += 1
que.append(nowY+1, nowX, dis)
que.append(nowY-1, nowX, dis)
que.append(nowY, nowX+1, dis)
que.append(nowY, nowX-1, dis)
return visited_c[goal0][goal1]
ans = 0
que = deque()
ans += bfs(*start, 0, goal(1), que)
for i in range(2, n+1):
ans += bfs(*goal(i-1), 0, goal(i), que)
print(ans)
解答
code: python
from collections import deque
h, w, n = map(int, input().split())
maps = input() for _ in range(h)
def bfs(que, dis, maps, h , w):
while que:
nowi, nowj = que.popleft()
for i, j in -1, 0], 0, 1, 0, -1, [1 ,0:
nexti, nextj = nowi + i, nowj + j
if nexti < 0 or nexti > h - 1 or nextj < 0 or nextj > w - 1 or disnextinextj != 0 or mapsnextinextj == 'X':
continue
else:
disnextinextj = disnowinowj + 1
que.append(nexti, nextj)
return dis
# スタート地点を0, チーズ工場を1以降に
cheeses = None * (n + 1)
for i in range(h):
for j in range(w):
if mapsij != '.' and mapsij != 'X' and mapsij != 'S':
cheeses[int(mapsij)] = i, j
if mapsij == 'S':
cheeses0 = i, j
# .X..1
# ....X
# .XX.S
# .2.X.
# print(cheeses) # 2, 4], 0, 4, [3, 1
ans = 0
for i in range(n):
que = deque([cheesesi])
dis = [0 * w for _ in range(h)]
res = bfs(que, dis, maps, h, w)
# 二点間の距離足していく 2, 4 ~ 0, 4, 0, 4 ~ 3, 1
ans += res[cheesesi + 10][cheesesi + 11]
print(ans)
テーマ
#bfs
蟻本 2-1 迷路の最短路
メモ
PythonでJOI難易度5を埋める #22
提出
code: python
from collections import deque
h, w, n = list(map(int, input().split()))
area = list(input()) for _ in range(h)
q = deque()
visited = [0 * w for _ in range(h)]
for i in range(h):
for j in range(w):
if areaij == "S":
q.append((i, j, 1))
while q:
nowi, nowj, dis = q.popleft()
if nowi < 0 or nowi > h-1 or nowj < 0 or nowj > w-1 or visitednowinowj != 0 or areanowinowj == "X":
continue
else:
visitednowinowj = dis
dis += 1
q.append((nowi + 1, j, dis))
q.append((nowi - 1, j, dis))
q.append((nowi, j + 1, dis))
q.append((nowi, j - 1, dis))
print(visited)