# Return the solution of the sudoku. global getans, visitx, visity def check(x, y, grid): x = x/3*3 y = y/3*3 use = set() for i in range(3): for j in range(3): if grid[x+i][y+j] == 0: return True use.add(grid[x+i][y+j]) if len(use) == 9: return True return False def dfs(grid): global getans for i in range(9): for j in range(9): if grid[i][j] == 0: for k in range(1,10): if k not in visitx[i] and k not in visity[j]: grid[i][j] = k if check(i, j, grid): visitx[i].add(k) visity[j].add(k) dfs(grid) visitx[i].remove(k) visity[j].remove(k) if getans == 1: return grid[i][j] = 0 return getans = 1 def checkio(grid): global getans, visity, visitx visitx = [set() for i in range(9)] visity = [set() for i in range(9)] for i, row in enumerate(grid): for j, cell in enumerate(row): if cell != 0: visitx[i].add(cell) visity[j].add(cell) getans = 0 dfs(grid) return grid #These "asserts" using only for self-checking and not necessary for auto-testing if __name__ == '__main__': assert checkio([[0, 7, 1, 6, 8, 4, 0, 0, 0], [0, 4, 9, 7, 0, 0, 0, 0, 0], [5, 0, 0, 0, 0, 0, 0, 0, 0], [0, 8, 0, 0, 0, 0, 5, 0, 4], [0, 0, 0, 3, 0, 7, 0, 0, 0], [2, 0, 3, 0, 0, 0, 0, 9, 0], [0, 0, 0, 0, 0, 0, 0, 0, 9], [0, 0, 0, 0, 0, 3, 7, 2, 0], [0, 0, 0, 4, 9, 8, 6, 1, 0]]) == [[3, 7, 1, 6, 8, 4, 9, 5, 2], [8, 4, 9, 7, 2, 5, 3, 6, 1], [5, 6, 2, 9, 3, 1, 4, 7, 8], [6, 8, 7, 2, 1, 9, 5, 3, 4], [9, 1, 4, 3, 5, 7, 2, 8, 6], [2, 5, 3, 8, 4, 6, 1, 9, 7], [1, 3, 6, 5, 7, 2, 8, 4, 9], [4, 9, 8, 1, 6, 3, 7, 2, 5], [7, 2, 5, 4, 9, 8, 6, 1, 3]], "first" assert checkio([[5, 0, 0, 7, 1, 9, 0, 0, 4], [0, 0, 1, 0, 3, 0, 5, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 8, 5, 9, 7, 2, 6, 4, 0], [0, 0, 0, 6, 0, 1, 0, 0, 0], [0, 2, 6, 3, 8, 5, 9, 1, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 3, 0, 5, 0, 2, 0, 0], [8, 0, 0, 4, 9, 7, 0, 0, 6]]) == [[5, 6, 8, 7, 1, 9, 3, 2, 4], [9, 7, 1, 2, 3, 4, 5, 6, 8], [2, 3, 4, 5, 6, 8, 7, 9, 1], [1, 8, 5, 9, 7, 2, 6, 4, 3], [3, 9, 7, 6, 4, 1, 8, 5, 2], [4, 2, 6, 3, 8, 5, 9, 1, 7], [6, 1, 9, 8, 2, 3, 4, 7, 5], [7, 4, 3, 1, 5, 6, 2, 8, 9], [8, 5, 2, 4, 9, 7, 1, 3, 6]], "second" print('Done')