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.那回头想一下,这个队列其实是这个栈啊!