【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)
相关文章推荐
- [LeetCode]题解(python):037-Sudoku Solver
- python实现 LeetCode37——Sudoku Solver
- LeetCode 37 Sudoku Solver (C,C++,Java,Python)
- 【算法——Python实现】快速排序的优化:三路快速排序及Leetcode题目应用
- 【leetcode】Candy(python)
- [Leetcode] Sudoku Solver (Java)
- leetcode Combination Sum python
- [LeetCode]题解(python):005-Longest Palindromic Substring
- Leetcode 解题 Add Two Numbers Python
- LeetCode 105,106. Construct Binary Tree 重建二叉树 Python Solution
- BinarySortTree java python leetcode
- [Leetcode]@python 103. Binary Tree Zigzag Level Order Traversal
- Maximum Prodyct Subarray Leetcode Python
- leetcode 481. Magical String python
- Leetcode 6. ZigZag Conversion(python)
- [leetcode]Construct Binary Tree from Inorder and Postorder Traversal @ Python
- [LeetCode]题解(python):063-Unique Paths II
- python写算法题:leetcode: 14. Longest Common Prefix
- [leetcode]Binary Tree Preorder Traversal @ Python
- 【LeetCode with Python】 Search in Rotated Sorted Array