def next_empty_square(board):
empty_squares = ((x, y) for x in range(9) for y in range(9) if not board[x][y])
return next(empty_squares, (None, None))
def get_candidates(board, pos_x, pos_y):
adjacent_row = [board[pos_x][y] for y in range(9)]
adjacent_col = [board[x][pos_y] for x in range(9)]
adjacent_square = [board[x][y] for x in range((pos_x//3)*3, (pos_x//3)*3+3) for y in range((pos_y//3)*3, (pos_y//3)*3+3)]
return set(range(1, 10)) - set(adjacent_row + adjacent_col + adjacent_square)
def solve(board):
pos_x, pos_y = next_empty_square(board)
if (pos_x, pos_y) == (None, None):
return board
for candidate in get_candidates(board, pos_x, pos_y):
board[pos_x][pos_y] = candidate
if solve(board):
return board
board[pos_x][pos_y] = 0