您的位置:首页 > 编程语言 > Python开发

【Leetcode】【python】Sudoku Solver

2017-09-15 01:10 489 查看

题目大意

计算数独,假设解唯一

解题思路

回溯法,深度优先

代码

这一题注释写的很多,因为比较复杂头疼中

class Solution(object):
def isValue(self,board,x,y):
# 判断符合,就是上一题
for i in range(9):
if i != x and board[i][y] == board[x][y]:
return False
for j in range(9):
if j != y and board[x][j] == board[x][y]:
return False
j += 1
m = 3*(x // 3)
n = 3*(y // 3)
for i in range(3):
for j in range(3):
if (i + m != x or j + n != y) and board[i + m][j + n] == board[x][y]:
return False
return True
def dfs(self,board):
for i in range(9):
for j in range(9):
if board[i][j] == '.':
for k in '123456789':
board[i][j] = k  # 向第一个找到的空格填写了数字
# 左边验证该数字是符合标准的,右边验证之后一个数字是否正确(回溯法)
if self.isValue(board,i,j) and self.dfs(board):  #如果这两个and前后交换顺序就TLE
return True
board[i][j] = '.'
# 该False表示如果都不正确,之前一直没返回True
return False
# 这个True是每一行的最后如果没有数了,说明该行都填写上了,所以返回True这样self.dfs(board) = True,该行结束
return True

def solveSudoku(self, board):
"""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
self.dfs(board)


总结

上一题hashtable的解法效率很高,想挪过来判断,但始终没修改成功,以后有空改好它,在这里做备份。

class Solution(object):

seen = set()

def isValue(self,board,x,y):
# 判断符合,就是上一题
c = int(board[x][y])
if (x, c) in self.seen or (c, y) in self.seen or (x/3, y/3, c) in self.seen:
print 'buxing'
return False
self.seen.add((x, c))
self.seen.add((c, y))
self.seen.add((x/3, y/3, c))
return True

def dfs(self,board):
for i in range(9):
for j in range(9):
if board[i][j] == '.':
for k in '123456789':
board[i][j] = k  # 向第一个找到的空格填写了数字
# 左边验证该数字是符合标准的,右边验证之后一个数字是否正确(回溯法)
if self.isValue(board,i,j) and self.dfs(board):  #如果这两个and前后交换顺序就TLE,说明and确实只判断前面的False就会停止
return True
# 问题在何时删除这个key,应该是删除上一位已经正确的key
# else:
#     self.seen.remove((i, int(k)))
#     self.seen.remove((int(k), j))
#     self.seen.remove((i/3, j/3, c))
board[i][j] = '.'

# 该False表示如果都不正确,之前一直没返回True
return False
# 这个True是每一行的最后如果没有数了,说明该行都填写上了,所以返回True这样self.dfs(board) = True,该行结束
return True

def solveSudoku(self, board):
"
4000
""
:type board: List[List[str]]
:rtype: void Do not return anything, modify board in-place instead.
"""
for i in range(9):
for j in range(9):
c = board[i][j]
if c == '.':
continue
self.seen.add((i, int(c)))
self.seen.add((int(c), j))
self.seen.add((i/3, j/3, int(c)))
print self.seen
self.dfs(board)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python leetcode