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

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值