1. 程式人生 > >36.有效的數獨-Python-LeetCode

36.有效的數獨-Python-LeetCode

一、題目

判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。

  1. 數字 1-9 在每一行只能出現一次。
  2. 數字 1-9 在每一列只能出現一次。
  3. 數字 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. 先建立三個空陣列 rowcolcell,以 cell 為例,裡面的每個空字典都代表一個 3×3單元格,然後我們需要把資料一個個填進去
  2. 遍歷整個二維陣列,然後邊遍歷邊把陣列分別存入到 行 row , 列 col , 3×3單元格 cell 內的字典,存為key ,而不是 value
  3. 然後我們就可以判斷,行、列、3×3單元格 對應的字典內是否已經存在board[x][y]這個鍵名,如果存在,那麼說明重複了,返回 False
  4. 注意,字典中的值這裡都為1,但是沒有任何意義,你可以隨意更改
  5. 把陣列存入 3×3的單元格是一個難點,num = 3*(x//3)+y//3,這個式子是關鍵,可以找個數獨,然後代入進去好好理解下
  6. 當然你也可以不用這個式子,用if/else語句來判斷也行,那樣比較好理解,但是不如這個式子簡潔
  7. 類似於: if y<3 : ... elif 3<=y<6 : ... elif 6<=y : ...,

程式碼如下:

#row,col,cell分別代表行,列,3x3單元格
row, col, cell =
[{}, {}, {}, {}, {}, {}, {}, {}, {}],
[{}, {}, {}, {}, {}, {}, {}, {}, {}],
[{}, {}, {}, {}, {}, {}, {}, {}, {}]

for x in range(9):
    for y in range(9):
        #取得單元格
        num = 3*(x//3)+y//3  
        temp = board[x][y]
        #不需要存入 '.' 
        if temp != '.':
            if (temp not in row[x]
            and temp not in col[y]
            and  temp not in cell[num]):
                row[x][temp] = '1'
                col[y][temp] = '1'
                cell[num][temp] = '1'
            else:
                return False
return True

時間 64ms,擊敗了 99.3%

結語

歡迎關注我的公眾號 瘋子的Python筆記

公眾號二維碼.jpg