题目描述
编写一个程序,通过已填充的空格来解决数独问题。
一个数独的解法需遵循如下规则:
- 数字 1-9 在每一行只能出现一次。
- 数字 1-9 在每一列只能出现一次。
- 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
其中,空白格用 ‘.’ 表示。
解析
这是一道典型的回溯法算法题,对于每个位置,依次放置规则允许放置的数字,依次进行,直到没有数字满足条件,回溯到前一个,重新放置。
Python代码
class Solution:
def solveSudoku(self, board):
"""
Do not return anything, modify board in-place instead.
"""
def isAvailable(pos_row, pos_col, num):
if num in board[pos_row]:
return False
for i in range(9):
if board[i][pos_col] == num:
return False
gird33 = []
for i in range(pos_row//3*3, (pos_row//3+1)*3):
gird33 += board[i][pos_col//3*3:(pos_col//3+1)*3]
if num in gird33:
return False
return True
def posTry(pos_row, pos_col):
if pos_row == 9 and pos_col == 0:
return True
if board[pos_row][pos_col] == '.':
for i in range(1, 10):
if isAvailable(pos_row, pos_col, str(i)):
board[pos_row][pos_col] = str(i)
flag = posTry(pos_row+(pos_col+1) // 9, (pos_col+1) % 9)
if not flag:
board[pos_row][pos_col] = '.'
else:
return True
else:
return posTry(pos_row+(pos_col+1) // 9, (pos_col+1) % 9)
posTry(0, 0)
return board #调试