N×M의 행렬로 표현되는 맵이 있다. 맵에서 0은 이동할 수 있는 곳을 나타내고, 1은 이동할 수 없는 벽이 있는 곳을 나타낸다. 한 칸에서 다른 칸으로 이동하려면, 두 칸이 인접해야 한다. 두 칸이 변을 공유할 때, 인접하다고 한다.
각각의 벽에 대해서 다음을 구해보려고 한다.
한 칸에서 이동할 수 있는 칸은 상하좌우로 인접한 칸이다.
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다.
맵의 형태로 정답을 출력한다. 원래 빈 칸인 곳은 0을 출력하고, 벽인 곳은 이동할 수 있는 칸의 개수를 10으로 나눈 나머지를 출력한다.
import sys
from collections import deque
def bfs(x, y):
q = deque([])
q.append((x, y))
visited[x][y] = 1
check = [(x, y)]
while q:
x, y = q.popleft()
for dx, dy in [(-1,0), (1,0), (0,-1), (0,1)]:
nx, ny = x + dx, y + dy
if 0 <= nx < n and 0 <= ny < m and not visited[nx][ny] and arr[nx][ny] == '0':
q.append((nx, ny))
visited[nx][ny] = 1
check.append((nx, ny))
for i, j in check:
grid[i][j] = check
n, m = map(int, input().split())
arr = [list(sys.stdin.readline().rstrip())for _ in range(n)]
visited = [[0] * m for _ in range(n)]
grid = [[1] * m for _ in range(n)]
for i in range(n):
for j in range(m):
if arr[i][j] == '0' and not visited[i][j]:
bfs(i,j)
for i in range(n):
for j in range(m):
if grid[i][j] == 1:
lst = []
for di, dj in [(-1,0), (1,0), (0,-1), (0,1)]:
ni, nj = i + di, j + dj
if 0 <= ni < n and 0 <= nj < m and type(grid[ni][nj]) != int:
if grid[ni][nj] not in lst:
lst.append(grid[ni][nj])
lst = list(map(lambda x : len(x), lst))
arr[i][j] = str((sum(lst)+1)%10)
for a in arr:
print(''.join(a))