算法分析与设计课程(8):【leetcode】Sudoku Solver

来源:互联网 发布:呼葱觅蒜用的软件 编辑:程序博客网 时间:2024/04/29 09:02

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)




0 0
原创粉丝点击