코드

import sys

Sudoku = [[0 for j in range(9)] for i in range(9)]
Blank = []
for i in range(9):
    Sudoku[i] = list(map(int,sys.stdin.readline().split()))

for i in range(9):
    for j in range(9):
        if Sudoku[i][j] == 0:
            Blank.append((i,j))

def Valid(row,col,num):
    temp_row = int(row/3)
    temp_col = int(col/3)
    for i in range(9):
        if num == Sudoku[row][i] or num == Sudoku[i][col]:
            return 0
    for i in range(3):
        for j in range(3):
            if num == Sudoku[(3*temp_row)+i][(3*temp_col)+j]:
                return 0
    return 1

def dfs(idx):
    if idx == len(Blank):
        for i in range(9):
            for j in range(9):
                print(Sudoku[i][j], end=' ')
            print()
        exit(0)
    for i in range(9):
        if Valid(Blank[idx][0],Blank[idx][1],i+1):
            Sudoku[Blank[idx][0]][Blank[idx][1]] = i + 1
            dfs(idx+1)
            Sudoku[Blank[idx][0]][Blank[idx][1]] = 0

dfs(0)

스도쿠의 0 위치를 저장해두고 저장된 배열을 이용하여 빈칸을 채워나간다.

틀린 경우가 있었는데, 정답 판을 출력한 후 exit(0)을 사용하지 않고 return을 사용하면 모든 정답 스도쿠 판을 출력하게 되어 틀리게 된다.

댓글남기기