leetcode第37题:解数独

class Solution(object):
    def solveSudoku(self, board):
        """
        :type board: List[List[str]]
        :rtype: None Do not return anything, modify board in-place instead.
        基本思路就是回溯算法DFS,应该不会超时
        """
        list_point=[]#'.'的队列
        for i in range(9):
            for j in range(9):
                if board[i][j]=='.':
                    list_point.append([i,j])
                else:
                    pass
        def MatchPoint(curr_point,i,j):#当前点取值是否合适
            list_temp=[]
            for a in range(3):
                for b in range(3):
                    list_temp.append(board[(i/3)*3+a][(j/3)*3+b])
            if curr_point in board[i]:
                return False
            elif curr_point in [board[n][j] for n in range(9)]:
                return False
            elif curr_point in list_temp:
                return  False
            else:
                return True
        def DFSSudoku():#DFS算法
            if list_point==[]:#队列空,递归出口
                return 1
            else:#'.'队列不空,递归入口
                i,j=list_point[0]
                for curr_point in ['1','2','3','4','5','6','7','8','9']:
                    if MatchPoint(curr_point,i,j)==True:
                        list_point.pop(0)#改变'.'队列的状态
                        board[i][j]=curr_point
                        a=DFSSudoku()#截获返回值1
                        if a==1:#截获到1,一直返回
                            return 1
                        else:#没有截获到,恢复'.'队列的状态
                            list_point.insert(0,[i,j])
                            board[i][j]='.'
                    else:
                        pass
        DFSSudoku()

最近先不做困难了吧,太浪费时间了啊!

还是写一下思路,也是标准的DFS:重点在于

1.递归出口的设置:return 1(后面讲为什么)。

2.递归体首先从待处理队列(list_point)中取队首,按照1-9的顺序赋值,如果这个值满足当前数独状态,队首出队(改变待处理队列状态),递归,在返回上一级函数栈的时候先去查看return值是否为1,如果是说明可以一路返回(因为只有一个解)。否则队首归队(恢复队列状态),继续完成递归

3.那回头想一下,这个队列其实是这个栈啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值