python37降到36原来的包还可以用吗_【lc刷题】36/37 有效的数独/解数独(143-144/300)...
143-144/300
有效的數獨
判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
上圖是一個部分填充的有效的數獨。
數獨部分空格內已填入了數字,空白格用 ‘.’ 表示。
示例 1:
輸入:
[
[“5”,“3”,".",".",“7”,".",".",".","."],
[“6”,".",".",“1”,“9”,“5”,".",".","."],
[".",“9”,“8”,".",".",".",".",“6”,"."],
[“8”,".",".",".",“6”,".",".",".",“3”],
[“4”,".",".",“8”,".",“3”,".",".",“1”],
[“7”,".",".",".",“2”,".",".",".",“6”],
[".",“6”,".",".",".",".",“2”,“8”,"."],
[".",".",".",“4”,“1”,“9”,".",".",“5”],
[".",".",".",".",“8”,".",".",“7”,“9”]
]
輸出: true
示例 2:
輸入:
[
[“8”,“3”,".",".",“7”,".",".",".","."],
[“6”,".",".",“1”,“9”,“5”,".",".","."],
[".",“9”,“8”,".",".",".",".",“6”,"."],
[“8”,".",".",".",“6”,".",".",".",“3”],
[“4”,".",".",“8”,".",“3”,".",".",“1”],
[“7”,".",".",".",“2”,".",".",".",“6”],
[".",“6”,".",".",".",".",“2”,“8”,"."],
[".",".",".",“4”,“1”,“9”,".",".",“5”],
[".",".",".",".",“8”,".",".",“7”,“9”]
]
輸出: false
解釋: 除了第一行的第一個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。
但由于位于左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。
說明:
一個有效的數獨(部分已被填充)不一定是可解的。
只需要根據以上規則,驗證已經填入的數字是否有效即可。
給定數獨序列只包含數字 1-9 和字符 ‘.’ 。
給定數獨永遠是 9x9 形式的。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/valid-sudoku
思路:記錄
根據題目要求,對于每一個數,都有三個點位:某行,某列,某個3x3 subgrid
只要保證不重復就ok。 譬如下圖:左邊圖是個美好的數獨,右邊圖改了一下。
對于[0][0]的’8’有三個點位:0行,0列,(0,0)的subgrid
對于[2][2]的’8’有三個點位:2行,2列,(0,0)的subgrid
對于[3][0]的’8’有三個點位:3行,0列,(1,1)的subgrid
這就說明(0,0)subgrid有倆’8’,0列也有倆’8’,不行啊。
所以見過的用(行,此數字),(此數字,列)【倒個個兒,防止行列不分】,(subgrid的坐標,此數字) 來記錄。
然后判斷集合==set(此集合),同則T,不同就F。
class Solution:
def isValidSudoku(self, board: List[List[str]]) -> bool:
res = []
for i, row in enumerate(board):
for j, n in enumerate(row):
if n != '.':
res += (i,n),(n,j),(i//3,j//3,n)
return len(res) == len(set(res))1
2
3
4
5
6
7
8
9
10
解數獨
編寫一個程序,通過已填充的空格來解決數獨問題。
一個數獨的解法需遵循如下規則:
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
空白格用 ‘.’ 表示。
一個數獨。
答案被標成紅色。
Note:
給定的數獨序列只包含數字 1-9 和字符 ‘.’ 。
你可以假設給定的數獨只有唯一解。
給定數獨永遠是 9x9 形式的。
來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/sudoku-solver
思路:有選擇的嘗試
譬如走到[0][2]要填個數:
最初選擇:{‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’}
減去行出現過的{’.’, ‘3’, ‘5’, ‘7’}
減去列出現過的 {’.’, ‘8’}
減去subgrid中出現過的:{’.’, ‘3’, ‘5’, ‘6’, ‘8’, ‘9’}
最后的結果是:{‘1’, ‘2’, ‘4’}
然后當[0][2]=1時,走向[0][3],開始新的一輪嘗試。
譬如,前面都嘗試沒問題,然后嘗試[0][7] =2的下一步[0][8] = 9
但列出現過9,這時候{‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’, ‘9’} - {‘1’, ‘2’, ‘3’, ‘4’, ‘5’, ‘6’, ‘7’, ‘8’}-{‘1’, ‘3’, ‘5’, ‘6’, ‘9’} - {‘1’, ‘2’, ‘6’} = set(), 屁也沒有, 退回上一步[0][7] =2, 把[0][7]恢復為’.’
然后嘗試[0][7] =9,那么下一步[0][8] = 2
行列subgrid都不重復,進入下一行的嘗試,[1][1] = …
當進行到[8][2] =1時,一切完美,沒有’.'的存在,我們就可以一層層返回之前的嘗試收尾。
class Solution:
def solveSudoku(self, board):
def dfs():
for i, row in enumerate(board):
for j, num in enumerate(row):
if num == '.':
for x in {'1', '2', '3', '4', '5', '6', '7', '8', '9'} - {row[k] for k in range(9)} - {board[k][j] for k in range(9)} - {board[i // 3 * 3 + m][j // 3 * 3 + n] for m in range(3) for n in range(3)}:
board[i][j] = x
if dfs(): return True
board[i][j] = '.'
return False
return True
dfs()1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
總結
以上是生活随笔為你收集整理的python37降到36原来的包还可以用吗_【lc刷题】36/37 有效的数独/解数独(143-144/300)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python除号的乘法加括号_乘除法添加
- 下一篇: 安装python的twisted_如何在