LeetCode第三十七題 Python實現

2021-10-19 10:27:38 字數 2556 閱讀 4495

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...