Description:
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle.
...and its solution numbers marked in red.
算法分析:
这题可以采用回溯法。
本题找到解的处理是return true,因此返回值为bool。
对于每个空位'.',遍历1~9,check合理之后往下一个位置递归。
由于这里路径尝试本质上是有序的,即1~9逐个尝试,因此无需额外设置状态位记录已经尝试过的方向。
注意:只有正确达到最终81位置(即成功填充)的填充结果才可以返回,若不然,将会得到错误的填充。
因此辅助函数solve需要设为bool而不是void。
代码如下:
__author__ = 'andy'
class Solution:
# @param board, a 9x9 2D array
# Solve the Sudoku by modifying the input board in-place.
# Do not return any value.
def check(self, x, y, board):
tmp = board[x][y]
board[x][y] = '.'
for row in range(9):
if board[row][y] == tmp:
return False
for col in range(9):
if board[x][col] == tmp:
return False
for row in range(3):
for col in range(3):
if board[(x / 3) * 3 + row][(y / 3) * 3 + col] == tmp:
return False
board[x][y] = tmp
return True
def dfs(self, board):
for row in range(9):
for col in range(9):
if board[row][col] == '.':
for char in '123456789':
board[row][col] = char
if self.check(row, col, board) and self.dfs(board):
return True
board[row][col] = '.'
return False
return True
def solveSudoku(self, board):
self.dfs(board)