Algorithm(CodeTree, Python)/BFS
[코드트리] 상한 귤 Python
by kurooru
2023. 3. 2.
# n, k 입력
n, k = map(int, input().split())
# box 입력
box = [
list(map(int, input().split()))
for _ in range(n)
]
# in_range
def in_range(x, y):
return 0 <= x < n and 0 <= y < n
# can_spread
def can_spread(x, y):
# 범위 내에 있고, 방문한 적 없으며, 귤이면 됨
return in_range(x, y) and not visited[x][y] and box[x][y] == 1
# bfs
def bfs():
while q:
x, y = q.popleft()
dxs, dys = [-1, 1, 0, 0], [0, 0, -1, 1]
for dx, dy in zip(dxs, dys):
nx, ny = x + dx, y + dy
if can_spread(nx, ny):
q.append((nx, ny))
visited[nx][ny] = True
step[nx][ny] = step[x][y] + 1
# 설계
# visited
visited = [
[False] * n
for _ in range(n)
]
# step
step = [
[0] * n
for _ in range(n)
]
# 큐 사용 준비
from collections import deque
q = deque()
# gone_oranges
gone_oranges = []
# box를 돌면서
for i in range(n):
for j in range(n):
# 상한 귤을 발견하면
if box[i][j] == 2:
# gone_oranges에 추가
gone_oranges.append((i, j))
# 상한 귤을 모두
for orange in gone_oranges:
# unpacking
orange_x, orange_y = orange
# 큐에 넣어주고
q.append((orange_x, orange_y))
# 방문 처리 해 주고
visited[orange_x][orange_y] = True
# bfs()
bfs()
for i in range(n):
for j in range(n):
# 0이면
if not box[i][j]:
# -1로 기록
step[i][j] = -1
# 귤이였으나 안상했으면
if box[i][j] == 1 and not visited[i][j]:
# -2로 기록
step[i][j] = -2
# 출력
for i in range(n):
for j in range(n):
print(step[i][j], end=' ')
print()