LeetCode 解題筆記——有效的數獨
阿新 • • 發佈:2018-11-07
題目描述:判斷一個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。
- 數字
1-9
在每一行只能出現一次。 - 數字
1-9
在每一列只能出現一次。 - 數字
1-9
在每一個以粗實線分隔的3x3
宮內只能出現一次。
解題思路:
按順序判斷這三個條件即可,一旦判斷為無效,直接返回False
具體方法:
在判斷行內是否有效時,先將str轉換為int,注意碰到 '.' 時不轉
for i in range(9): board1[i] = [int(x) for x in board1[i] if x != "."] #將字串轉為int,字元'.'將丟棄
這樣就將每行的數字提取出來了。之後將列表轉為集合,再比較集合與列表的長度,如果長度相同,則說明這一行不存在重複數字;如果長度不同,說明有重複數字,就可以返回False了
在判斷列內是否有效時,需要先用zip函式轉置一下,之後處理流程和行的處理流程相同
判斷每個小的3*3的格子是否有效時,需要先將每個小格拼成一個列表,再去判斷。
每次判斷的方法都是一樣的,區別是前期的處理,行不需處理,列需要轉置,小格需要拼接。當所有的判斷都通過時,返回True。
第一個版本寫得很差,很多程式碼重複的地方可以寫成函式,第二次寫的時候改進一下就好。
# 0. 判斷每行是否符合要求。 board1 = board.copy() for i in range(9): board1[i] = [int(x) for x in board1[i] if x != "."] #將字串轉為int,字元'.'將丟失 j = 0 while j<9 : board1_set = set(board1[j]) if len(board1_set) ==len(board1[j]) : j +=1 else: return False # 1. 判斷每列是否符合要求 col = list(zip(board[0], board[1], board[2], board[3], board[4], board[5], board[6], board[7],board[8])) for x in col: x = list(x) for i in range(9): col[i] = [int(x) for x in col[i] if x != "."] #將字串轉為int,字元'.'將丟失 j = 0 while j<9 : board1_set = set(col[j]) if len(board1_set) == len(col[j]): j +=1 else: return False # 2. 判斷每個九宮格是否符合要求 board3 = [] for i in range(0, 9, 3): for j in range(0, 9, 3): fx = board[i][j:j+3]+board[i+1][j:j+3]+board[i+2][j:j+3] board3.append(fx) #每個九宮格是一個小列表 for i in range(9): board3[i] = [int(x) for x in board3[i] if x != "."] #將字串轉為int,字元'.'將丟失 j = 0 while j<9 : board1_set = set(board3[j]) if len(board1_set) == len(board3[j]): j +=1 else: return False return True