title: leetcode no.37
categories:
tags:
今天三十了,新年快樂哈。
編寫乙個程式,通過填充空格來解決數獨問題。
乙個數獨的解法需遵循如下規則:
數字 1-9 在每一行只能出現一次。
數字 1-9 在每一列只能出現一次。
數字 1-9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。
空白格用 『.』 表示。
乙個數獨。
答案被標成紅色。
給定的數獨序列只包含數字 1-9 和字元 『.』 。
你可以假設給定的數獨只有唯一解。
給定數獨永遠是 9x9 形式的。
回撤法標準框架:
def backtrack(path, selected):
if 滿足停止條件:
for 選擇 in 選擇列表:
做出選擇
遞迴執行backtrack
滿足則return true
如果不滿足要求就撤銷選擇
class solution(object):
# 檢查選擇要填充的數字是否在一行/一列/九個格仔裡面出現
def check(self, board, row, col, c):
for i in range(9):
if board[row][i] == c:
return false
if board[i][col] == c:
return false
if board[(row//3)*3 + i // 3][(col//3)*3 + i % 3] == c:
return false
return true
# 回溯法
def backtrack(self,board,i,j):
# 停止條件
## 一行訪問完之後跳轉到下一行
if j == 9:
return self.backtrack(board,i+1,0)
## 所有行訪問完之後,返回true
if i == 9:
return true
## 如果不為.,則不用管,繼續訪問下一列
if board[i][j] != '.':
return self.backtrack(board,i,j+1)
# 選擇操作
## 遍歷選擇列表,此處的選擇是,給空白處填 "1" - "9" 中之一
for k in range(1,10):
c = str(k)
if not self.check(board, i, j, c): # 判斷選擇的字元是否滿足要求(不與其他位置衝突)
continue
board[i][j] = c # 做出選擇
if self.backtrack(board, i, j + 1): # 遞迴呼叫,直接return是因為只需要乙個可行解,而不需要所有可行解
return true
board[i][j] = '.' # 撤銷選擇
def solvesudoku(self, board):
""":type board: list[list[str]]
:rtype: none do not return anything, modify board in-place instead.
核心思想:採用回溯法
回溯法的標準框架
def backtrack(path, selected):
if 滿足停止條件:
for 選擇 in 選擇列表:
做出選擇
遞迴執行backtrack
滿足則return true
如果不滿足要求就撤銷選擇
"""self.backtrack(board,0,0)
return board
if __name__ == '__main__':
s = solution()
print(s.solvesudoku([["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"]]))
第三十七章 天神山
茫茫草原上。李正在那雄性烈風神鵰面前,口中也出一連竄悅耳的聲音。那頭烈風神鵰看了看滕青山,李在旁邊又連著勸說。終於,那頭黑色烈風神鵰那碩大頭顱點了點。李興奮轉頭看向滕青山 滕大哥,大黑已經答應了,來吧,你坐在它背上。這烈風神鵰還真的聽你話。滕青山驚訝地走過來,隨後一躍而起,落在那烈風神鵰背上。烈風神...
第三十七節 log日誌模組
import logging 日誌一共分為5個等級,從低到高分別是 1 debug 詳細的資訊,通常只出現在診斷上 2 info 確認一切按預期執行 3 warning 乙個跡象表明,一些意向不到的事情發生了,或者表明一些問題在不久將來 4 error 更嚴重的問題,軟體沒執行一些功能 5 crit...
第三十七講 用迴圈處理文字
專案1 m pszi y是嘛意思?小明讓同學傳紙條給小麗,紙條上寫著m pszi y。小麗接到會心一笑,大家卻不知所云。他們倆的花招瞞不過老師,給你乙個程式,輸入m pszi y,輸出的,就是小明的真實意思!老師真壞!下面,該你執行程式了,明白這樣的處理方式後,擴充套件完成後面的兩項工作 cpp v...