题解 | #Sudoku#

Sudoku

https://www.nowcoder.com/practice/78a1a4ebe8a34c93aac006c44f6bf8a1

import sys

def check(board, x, y):
    for i in range(9):
        if i != x and board[i][y] == board[x][y]:   #检查行
            return False
        if i != y and board[x][i] == board[x][y]:   #检查列
            return False
    m = (x//3)*3    # 0 1 2 -> 0 3 6
    n = (y//3)*3    # 0 1 2 -> 0 3 6
    for i in range(m,m+3):      #检查3x3
        for j in range(n,n+3):
            if(i!=x or j!=y) and board[i][j] == board[x][y]:
                return False
    return True


def dfs(board):
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:
                for v in range(1,10):   # 0-9试数字
                    board[i][j] = v
                    if check(board,i,j) and dfs(board):     
                        return True     #添加成功,跳出循环
                    board[i][j] = 0     #当前数值不行,把值改回0

                return False    # 这一轮的False是因为上一轮没填对,【回溯到上一轮重新填】!!
                
    return True

while 1:
    try:
        sudoku = [[] for i in range(9)]
        for i in range(9):  #录入2d list
            sudoku[i] = list(map(int, input().split(' ')))  
                
        dfs(sudoku)

        for i in sudoku:
            for j in i:
                print(j, end=' ')
            print()
    except:
        break

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务