def check(sudoku, i, j): # 判断这个数填入数独的i,j位置是否合理 for k in range(9): if (sudoku[i][k] == sudoku[i][j]) and (k != j): # 若是这一列有重复的数据,认为这个数非法 return False for k in range(9): if (sudoku[k][j] == sudoku[i][j]) and (k != i): # 若是这一行有重复的数据,认为这个数非法 return False m = 3 * (i // 3) # m,n分别是i,j位置所在的3*3格子的最左上角的位置 n = 3 * (j // 3) for k in range(3): for z in range(3): if ( (sudoku[m + k][n + z] == sudoku[i][j]) and ((m + k) != i) and ((n + z) != j) ): # 判断所在3*3格子是否有重复的数据 return False return True # 若都没有,那么认为这个数在重复上面没有问题 def find_sudoku(sudoku): for i in range(9): for j in range(9): if sudoku[i][j] == 0: # 若是找到为0的 for t in range(1, 10): # 在这个位置依次填入1-9尝试 sudoku[i][j] = t if (check(sudoku, i, j)) and ( find_sudoku(sudoku) ): # 若是满足数独要求,而且填完这个数之后的0也能被成功填写 return True # 认为成功 sudoku[i][j] = 0 # 如果1-9都不行认为是之前填的数不合适,恢复这次填的数 return False # 返回之前一个false return True # 走到这一步认为所有的空都被填满,返回成功 while True: try: sudoku = [] sudoku_index = [] for i in range(9): a = list(map(int, input().split())) sudoku.append(a) # 将数独输入 find_sudoku(sudoku) for i in range(9): print(*sudoku[i]) except: break