输入一个
的不完整数独矩阵,矩阵中的数字为
。其中,
表示该位置的数字尚未填入,
表示该位置的数字已经填入。
输出一个
的完整数独矩阵。
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))))