2239.スドック


質問リンク


2239.スドック

問題コード


def is_promising(blank,num):

    x,y = blank

    if num in sudoku[x]: #가로 검사
        return False

    for i in range(9): #세로 검사
        if num == sudoku[i][y]:
            return False

    square_x = x//3
    square_y = y//3

    for i in range(square_x*3,square_x*3+3):
        for j in range(square_y*3,square_y*3+3):
            if num == sudoku[i][j]:
                return False

    return True

def print_sudoku():
    print("==========")
    for i in range(9):
        print(sudoku[i])


def back_tracking(idx):

    global is_solved

    if is_solved == True:
        return

    if idx >= len(blank_list):
        is_solved = True
        return

    blank = blank_list[idx]

    for i in range(1,10):
        if is_promising(blank,i):
            sudoku[blank[0]][blank[1]] = i
            #print_sudoku()
            back_tracking(idx+1)
            if is_solved == True:
                return
            sudoku[blank[0]][blank[1]] = 0




sudoku = [[0 for col in range(9)]for row in range(9)]
blank_list = []
for i in range(9):
    num_list = input()
    for j in range(9):
        sudoku[i][j] = int(num_list[j])
        if sudoku[i][j] == 0:
            blank_list.append([i,j])

is_solved = False
back_tracking(0)

for i in range(9):
    result = ""
    for j in range(9):
        result += str(sudoku[i][j])

    print(result)

問題を解く

  • のライブラリを入力し、空白を検索してリストに保存します.
  • 遡及blank list順
  • 定価充填数独の
  • の数字は小さい順に入れるので、最初に現れる数独は最小の数独
  • でなければならない.
  • ですので、空欄にすると、スドックを探す必要はありません.
  • isSolvedをTrueに変換し、数独の検索を停止
    出力
  • で見つけた数独、終了