class sudoku:
def __init__(self, matrix):
self.matrix = matrix
def setNum(self, row, col, num):
self.matrix[row][col] = num
def initMatrixWithZero(self):
self.matrix = []
for i in range(9):
self.matrix.append([0 for i in range(9)])
def initMatrixWithString(self, s):
if not len(s) == 9*9:
return False
p = [s[i*9:(i+1)*9] for i in range(9)]
p = [[int(st[i]) for i in range(9)] for st in p]
self.matrix = p
def initMatrixWithInt(self, i):
return self.initMatrixWithString(str(i))
def getEmptyCell(self):
"搜索某个空位以填入数独"
for row in range(9):
for col in range(9):
if self.matrix[row][col] == 0:
return row, col
def solve(self):
"解决数独"
if not self.getEmptyCell():
return True
r, c = self.getEmptyCell()
for num in range(1, 10):
if self.isValid(r, c, num):
self.matrix[r][c] = num
if self.solve():
return True
self.matrix[r][c] = 0
return False
def isValid(self, row, col, num):
"判断是否能填入"
s = self.getBlock(self.getStartPos(row, col))
for i in range(9):
if self.matrix[row][i] == num or self.matrix[i][col] == num:
return False
for n in range(3):
for m in range(3):
if s[n][m] == num:
return False
return True
def getBlock(self, startpos):
"通过3x3区块的起始位置获取该区块"
l = [[], [], []]
for row in range(startpos[0], startpos[0]+3):
for col in range(startpos[1], startpos[1]+3):
l[row-startpos[0]].append(self.matrix[row][col])
return l
def getStartPos(self, row, col):
"获取某一位置所处的3x3区块的起始位置"
startRow = (row // 3) * 3
startCol = (col // 3) * 3
return startRow, startCol
def prettyPrint(self):
"整洁输出"
for r in self.matrix:
for c in r:
print(c, end=' ')
print()
test = [
[1, 0, 0, 0, 0, 0, 0, 0, 0],
[0, 2, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 3, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 4, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 5, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 6, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 7, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 8, 0],
[0, 0, 0, 0, 0, 0, 0, 0, 9],
]
s = sudoku(test)
s.solve()
s.prettyPrint()
[笔记]解9x9数独
最新推荐文章于 2024-08-14 10:10:06 发布