题解 | #Sudoku#

Sudoku

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

1、找到第一个为0为坐标,开始尝试求解
def find_zero(board):
    for i in range(9):
        for j in range(9):
            if board[i][j] == 0:
                return i, j
    return None

2、判断输入的value是否正确,即 按行、按列、按区域:值的范围[1,9],且不能重复
def is_valid(board, val, row, col):
    for i in range(9):
        if board[i][col] == val:
            return False

    for j in range(9):
        if board[row][j] == val:
            return False

    row_start = 3 * (row // 3)
    col_start = 3 * (col // 3)
    row_end = row_start + 3
    col_end = col_start + 3
    for x in range(row_start, row_end):
        for y in range(col_start, col_end):
            if board[x][y] == val:
                return False
    return True
3、全局遍历并实现回溯
def dfs(board):
    bl = find_zero(board)
    if not bl:
		# 没有空白了,表示数据填完了
        return True
    else:
        r, c = bl
	# 从第一个空白开始尝试,尝试值为[1,9]
    for val in range(1, 10):
        if is_valid(board, val, r, c):
			# 如果val满足条件,就更新
            board[r][c] = val
			# 递归开始填充后面的空白,如果全部填完则结束,返回True
            if dfs(board):
                return True
			# 否则,回溯数据
            board[r][c] = 0
	# 循环结束,没有满足条件的,则返回False
    return False


def main():
    board = []
    for i in range(9):
        line_s = [int(x) for x in input().split()]
        board.append(line_s)
	# 能完成则输出
    if dfs(board):
        for item in board:
            print(" ".join([str(x) for x in item]))
    else:
        print('ERROR')

main()

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务