LeetCode 37.解數獨
阿新 • • 發佈:2020-07-11
編寫一個程式,通過已填充的空格來解決數獨問題。
一個數獨的解法需遵循如下規則:
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每一個以粗實線分隔的 3x3 宮內只能出現一次。
空白格用 '.' 表示。
一個數獨。
答案被標成紅色。
Note:
給定的數獨序列只包含數字 1-9 和字元 '.' 。
你可以假設給定的數獨只有唯一解。
給定數獨永遠是 9x9 形式的。
class Solution: def solveSudoku(self, board: List[List[str]]) -> None: """ Do not return anything, modify board in-place instead. """ self.flag_rows = [[0 for _ in range(10)] for _ in range(9)] self.flag_cols = [[0 for _ in range(10)] for _ in range(9)] self.flag_33boxes = [[0 for _ in range(10)] for _ in range(9)] for i in range(9): for j in range(9): num_str = board[i][j] box_k = int(i/3)*3+int(j/3) if num_str!='.': num = int(num_str) self.flag_rows[i][num] = 1 self.flag_cols[j][num] = 1 self.flag_33boxes[box_k][num] = 1 self.fill(board,0,0) def fill(self,board,i,j): if i>=9 or j>=9: return True next_i = i if j <8 else i+1 next_j = j+1 if j<8 else 0 if board[i][j]!='.': return self.fill(board,next_i,next_j) else: for num in range(1,10): box_k = int(i/3)*3+int(j/3) if self.flag_rows[i][num] == 0 and self.flag_cols[j][num] == 0 and self.flag_33boxes[box_k][num] ==0: self.flag_rows[i][num] = 1 self.flag_cols[j][num] = 1 self.flag_33boxes[box_k][num] = 1 board[i][j] = str(num) result = self.fill(board,next_i,next_j) if result is True: return True else: self.flag_rows[i][num] = 0 self.flag_cols[j][num] = 0 self.flag_33boxes[box_k][num] = 0 board[i][j] = '.' return False