题解 | #Sudoku#

Sudoku

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

# dfs深度优先算法

#判断填了数之后,是否符合数独规则
def isValue(board, x, y):
    # 检查已经填入的坐标是否和列中有的元素相等
    for i in range(9):
        if i != x and board[i][y] == board[x][y]:
            return False
    # 检查已经填入的坐标是否和行中有的元素相等
    for j in range(9):
        if j != y and board[x][j] == board[x][y]:
            return False

    # 检查每个3X3粗线宫是否符合(粗线框内只有1~9)
    m, n = 3 * (x // 3), 3 * (y // 3)  # 这里求出的是3x3网格的左上角的坐标
    for i in range(3):
        for j in range(3):
            if(i + m != x or j + n != y) and board[i + m][j + n] == 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 k in '123456789':  # 从里面选择一个
                    board[i][j] = int(k)#尝试设置一个值
                    if isValue(board, i, j) and dfs(board):
                        return True
                    # 尝试结束,退回设置
                    board[i][j] = 0
                # 都不行,说明上次的数字不合理
                return False
    # 全部遍历完,没有0了,返回True
    return True

while True:
    try:
        board = []
        for i in range(9):
            board.append(list(map(int, input().split())))

        dfs(board)
        for i in range(9):
            print(' '.join(list(map(str, board[i]))))
    except:
        break















全部评论

相关推荐

03-03 23:12
已编辑
北京邮电大学 Java
书海为家:我来给一点点小建议,因为毕竟还在学校不像工作几年的老鸟有丰富的项目经验,面试官在面试在校生的时候更关注咱们同学的做事逻辑和思路,所以最好在简历中描述下自己做过项目的完整过程,比如需求怎么来的,你对需求的解读,你想到的解决办法,遇到困难如何找人求助,最终项目做成了什么程度,你从中收获了哪些技能,你有什么感悟。
你的简历改到第几版了
点赞 评论 收藏
分享
评论
3
2
分享

创作者周榜

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