checkio (数独)

# 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')

你可能感兴趣的:(checkio (数独))