问题描述:数独(Sudoku)是一款大众喜爱的数字逻辑游戏。玩家需要根据9X9盘面上的已知数字,推算出所有剩余空格的数字,并且满足每一行、每一列、每一个3X3粗线宫内的数字均含1-9,并且不重复。
例如:
输入
输出
数据范围:输入一个 9*9 的矩阵
包含已知数字的9X9盘面数组[空缺位以数字0表示]
完整的9X9盘面数组
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
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))))