Sudoku Solver
Write a program to solve a Sudoku puzzle by filling the empty cells.
A sudoku solution must satisfy all of the following rules:
Each of the digits 1-9 must occur exactly once in each row.
Each of the digits 1-9 must occur exactly once in each column.
Each of the the digits 1-9 must occur exactly once in each of the 9 3x3 sub-boxes of the grid.
Empty cells are indicated by the character ‘.’.
Solution
TODO:
@优化方案: 从有最少可能性的位置开始计算以减少时间复杂度
@最佳方案: Dancing Links实现
class Solution(object):
def solveSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: None Do not return anything, modify board in-place instead.
"""
self.board = board
self.solve()
def generate(self):
for i in range(9):
for j in range(9):
if self.board[i][j]=='.':
return i,j
return -1,-1
def solve(self):
i,j = self.generate()
if i==-1 and j==-1:
return True
for num in ['1','2','3','4','5','6','7','8','9']:
if self.isvalid(i, j, num):
self.board[i][j]=num
if self.solve():
return True
self.board[i][j]='.'
return False
def isvalid(self, row, col, num):
boxrow = row - row%3
boxcol = col - col%3
if self.checkrow(row, num) and self.checkcol(col, num) and self.checkbox(boxrow, boxcol, num):
return True
else:
return False
def checkrow(self, row, num):
for col in range(9):
if self.board[row][col] == num:
return False
return True
def checkcol(self, col, num):
for row in range(9):
if self.board[row][col] == num:
return False
return True
def checkbox(self, row, col, num):
for i in range(row, row+3):
for j in range(col, col+3):
if self.board[i][j] == num:
return False
return True