题解 | #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