输入一个
的不完整数独矩阵,矩阵中的数字为
。其中,
表示该位置的数字尚未填入,
表示该位置的数字已经填入。
输出一个
的完整数独矩阵。
0 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 9 5 3 7 8 7 5 9 8 4 3 1 2 6 1 3 8 6 2 7 5 9 4 2 7 1 5 3 8 6 4 9 3 8 6 9 1 4 2 5 7 0 4 5 2 7 6 8 3 1
5 9 2 4 8 1 7 6 3 4 1 3 7 6 2 9 8 5 8 6 7 3 5 9 4 1 2 6 2 4 1 9 5 3 7 8 7 5 9 8 4 3 1 2 6 1 3 8 6 2 7 5 9 4 2 7 1 5 3 8 6 4 9 3 8 6 9 1 4 2 5 7 9 4 5 2 7 6 8 3 1
在这个样例中,输入的数独如下图一所示,输出的是数独的唯一解,如下图二所示。
import sys input_matrix = [] for line in sys.stdin: if line.strip() == "": break else: input_matrix.append(list(map(int, line.strip().split()))) # 另一种解法,直接使用递归,从第一个0开始填,直到填满。 # 递归逻辑如下: # 如果当前位置是0,则尝试1到9的数字 # 选一个数字,判断当前位置填入这个数字是否合法,如果合法,则填入,继续下一个0的位置。 # 如果下一个0的位置,填的的数字也合法,继续填,直到填满。 # 如果下一个0的位置,填的的数字都不合法,返回false,当前位置填入0,然后尝试其他数字。 # 如果找到最后一个位置,都没找到0,则返回true,表示成功,递归结束,输出矩阵。 def is_valid(row_index, col_index, value): # 判断行 for i in range(9): if input_matrix[row_index][i] == value: return False # 判断列 for i in range(9): if input_matrix[i][col_index] == value: return False # 判断九宫格 row_start = (row_index // 3) * 3 col_start = (col_index // 3) * 3 for i in range(row_start, row_start+3): for j in range(col_start, col_start+3): if input_matrix[i][j] == value: return False return True def sudoku(row_index, col_index): for i in range(0, 9): for j in range(0, 9): if input_matrix[i][j] == 0: for k in range(1, 10): if is_valid(i, j, k): input_matrix[i][j] = k if sudoku(i, j): # 下一个0的位置,填的的数字也合法,继续填 return True else: input_matrix[i][j] = 0 # 下一个0的位置,填的的数字不合法,回溯 return False # 当前位置,所有数字都不合法,返回false if i == 8 and j == 8: # 找到最后一个位置,返回true,表示成功 return True sudoku(0, 0) for i in range(len(input_matrix)): print(" ".join(map(str, input_matrix[i])))
# 定义检查当前数是否可以放置在数独的某一位置 def is_valid(board, row, col, num): # 检查行是否有重复数字 for i in range(9): if board[row][i] == num: return False # 检查列是否有重复数字 for i in range(9): if board[i][col] == num: return False # 检查3x3宫是否有重复数字 start_row, start_col = 3 * (row // 3), 3 * (col // 3) for i in range(3): for j in range(3): if board[start_row + i][start_col + j] == num: return False return True # 回溯法求解数独 def solve_sudoku(board): for row in range(9): for col in range(9): # 如果当前位置为空(用0表示),则尝试放置1-9的数字 if board[row][col] == 0: for num in range(1, 10): if is_valid(board, row, col, num): board[row][col] = num # 递归尝试解决下一个空位 if solve_sudoku(board): return True # 回溯,如果无法解,则恢复为0 board[row][col] = 0 else: return False return True # 打印数独 def print_board(board): for row in board: print(" ".join(str(num) for num in row)) import sys board = [list(map(int,line.split())) for line in sys.stdin.read().splitlines()] # 求解数独 if solve_sudoku(board): print_board(board) else: print("无法解决该数独")
def is_valid(board, row, col, num): # Check row and column for i in range(9): if board[row][i] == num&nbs***bsp;board[i][col] == num: return False # Check 3x3 box start_row, start_col = 3 * (row // 3), 3 * (col // 3) for i in range(start_row, start_row + 3): for j in range(start_col, start_col + 3): if board[i][j] == num: return False return True def solve_sudoku(board): for i in range(9): for j in range(9): if board[i][j] == 0: for num in range(1, 10): if is_valid(board, i, j, num): board[i][j] = num if solve_sudoku(board): return True board[i][j] = 0 return False return True def print_sudoku(board): for row in board: print(" ".join(map(str, row))) # Read input board = [] for _ in range(9): row = list(map(int, input().split())) board.append(row) # Solve and print solve_sudoku(board) print_sudoku(board)
def value(x, y): i, j = x // 3, y // 3 grid = [m[i * 3 + r][j * 3 + c] for r in range(3) for c in range(3)] row_val = m[x] col_val = list(zip(*m))[y] return {1, 2, 3, 4, 5, 6, 7, 8, 9} - set(grid) - set(row_val) - set(col_val) def sudoku(pos): if not pos: # 填完了 res.append([' '.join(map(str, i)) for i in m]) else: x, y = pos[0] val = value(x, y) if val: for v in val: m[x][y] = v sudoku(pos[1:]) m[x][y] = 0 # 回溯 m = [list(map(int, input().split())) for i in range(9)] pos = [(x, y) for y in range(9) for x in range(9) if not m[x][y]] res = [] sudoku(pos) print('\n'.join(res[0]))
g = [] # for i in range(9): g.append(list(map(int, input().split()))) # print(g) row = [[],[],[],[],[],[],[],[],[]] col = [[],[],[],[],[],[],[],[],[]] three = [[],[],[],[],[],[],[],[],[]] # print(row) # print(col) # print(three) fill = [] for r in range(9): for c in range(9): cur = g[r][c] if cur == 0: # 要填的数 fill.append((r,c)) continue # row 行的数 row[r].append(cur) # lie 列的数 col[c].append(cur) # three 的数 # print("r // 3 , c % 3: ", r // 3 , c // 3) # print("r,c, ",r, c, 2 * (r // 3) + c // 3 ) three[3 * (r // 3) + c // 3].append(cur) # print(row) # print(col) # print(three) # print(fill) def fun(index): # for r, c in fill: if index == len(fill): return True # print(">>>>:",index) # print("--:", index, fill[index]) r, c = fill[index] # print("r, c", r,c ) for i in range(1,10): if i in row[r]&nbs***bsp;i in col[c]&nbs***bsp;i in three[ 3 * ( r // 3) + c // 3] : continue else: # print("res:", i) g[r][c] = i row[r].append(i) col[c].append(i) three[ 3 * ( r // 3) + c // 3 ].append(i) if fun(index + 1): return True row[r].remove(i) col[c].remove(i) three[3 * ( r // 3) + c // 3 ].remove(i) # print("fill:", fill) for i in range(len(fill)): # print("***:", i) fun(i) for i in range(9): for j in range(9): print(g[i][j], end=" ") print()
#借鉴了一下评论里大佬的方法。然后用例是跑不过的自己判断过没过就行了 def check(ans,n,m,i): if i not in ans[n] and i not in list(zip(*ans))[m]: return True return False def sudoKu(res): if len(res)==0: return True n,m=res[0] for i in range(1,10): if check(ans,n,m,i): ans[n][m]=i if sudoKu(res[1:]):#这里之前想的是没有做判断 所以递归有问题 return True ans[n][m]=0#自己写到这了不晓得怎么回溯 原来这么简单 return False ans=[] resq=[] for i in range(9): ans.append(list(map(int,input().split()))) for i in range(9): for j in range(9): if ans[i][j]==0: resq.append((i,j)) sudoKu(resq) for i in ans: print(" ".join(list(map(str,i))))