์ค๋์ฟ ์ ๊ท์น์ ๋ง๊ฒ ๊ฐ ๋น์นธ์ ์ซ์๊ฐ ๋ค์ด๊ฐ๋์ง ๋ค์ด๊ฐ ์ ์๋ ๋ชจ๋ ์ซ์ ์กฐํฉ์ ๋ค ๋ฃ์ด๋ณธ๋ค. ๋์ค์ ํ๋๋ผ๋ ๊ท์น์ ๋ง์ง ์๋๋ค๋ฉด ๋ฐฑํธ๋ํน์ผ๋ก ๊ฐ์ง๋ฅผ ์ณ๋ธ๋ค.
๋น์นธ์ด ์ํ๋ ํ, ์ด, 3x3์นธ์ ์๋ ์ซ์๋ค์ ๊ต์งํฉ์ ํตํด ๊ตฌํ๋ค. ๊ทธ๋ฐ ๋ค์ ํ๋์ฉ ๋ฃ์ด๋ณด๊ณ ๋ง์ฝ ๋ชจ๋ ์นธ์ ๋ค ์ฑ์ธ ์ ์์๋ค๋ฉด True๋ฅผ ๋ฐํํ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ค์ ๋ฐฐ์ด์ ๊ทธ ๊ฐ์ด ๊ฑฐ๊พธ๋ก ์ฑ์์ง๋ฉด์ ๋ฐํ๋๋ค.
์ต์ข ์ ์ผ๋ก arr ๋ฐฐ์ด์ ์ถ๋ ฅํ๋ฉด ๋๋ค.
# pypy3 : 3480ms
# ์ค๋์ฟ
def check_row(x):
return {k for k in range(1, 10) if k not in arr[x]}
def check_col(y):
return {k for k in range(1, 10) if k not in [arr[x][y] for x in range(9)]}
def check_rect(x, y):
res = set(range(1, 10))
for i in range(3*x, 3*x+3):
for j in range(3*y, 3*y+3):
res -= {arr[i][j]}
return res
def find_blank(arr):
blank = dict()
for i in range(9):
for j in range(9):
if not arr[i][j]:
blank[(i, j)] = rows[i]&cols[j]&rects[3*(i//3)+j//3]
return blank
def check(x, y, k):
return k in rows[x]&cols[y]&rects[3*(x//3)+y//3]
def dfs(i, keys, arr):
if i == len(keys):
return True
x, y = keys[i]
for k in blank[(x, y)]:
if check(x, y, k):
rows[x].remove(k)
cols[y].remove(k)
rects[3*(x//3)+y//3].remove(k)
if dfs(i+1, keys, arr):
arr[x][y] = k
return True
rows[x].add(k)
cols[y].add(k)
rects[3*(x//3)+y//3].add(k)
return False
arr = [list(map(int, input().split())) for _ in range(9)]
rows = [check_row(i) for i in range(9)]
cols = [check_col(j) for j in range(9)]
rects = [check_rect(i, j) for i in range(3) for j in range(3)]
blank = find_blank(arr)
keys = list(blank.keys())
dfs(0, keys, arr)
for row in arr:
print(*row)