回溯演算法 解數獨

2021-09-29 22:30:37 字數 2334 閱讀 8517

假設-判斷-假設

class

solution()

:def

solve

(self,arr)

: self.helper(arr,0)

defhelper

(self,arr,index)

:if index==81:

print

(arr)

return

else

:if arr[index]==0

:# 0代表需要填充資料

for i in

range(1

,10):

if self.isvaild(arr,index,i)

: arr[index]

=i self.helper(arr,index+1)

arr[index]=0

# 如果假設下乙個格仔失敗就將本次的假設取消。

else

: self.helper(arr,index+1)

defisvaild

(self,arr,index,i)

: line = index//

9 column = index %

9if i in arr[line*

9:line*9+

9]:# 判斷這一行

return

false

if i in

[arr[j]

for j in

range

(len

(arr)

)if j%

9==column]

:# 判斷這一列

return

false

for l in

range

(line//3*

3,line//3*

3+3)

:# 判斷這個九宮格內

for c in

range

(column//3*

3,column//3*

3+3)

:if arr[l*

9+c]

==i:

return

false

return

true

if __name__ ==

'__main__'

: arr =[4

,1,0

,0,0

,7,8

,5,0

,8,0

,6,0

,0,0

,0,0

,9,0

,2,0

,0,9

,0,6

,0,0

,0,0

,4,0

,0,0

,0,1

,2,2

,0,0

,5,8

,0,0

,7,0

,0,0

,0,0

,0,0

,5,0

,0,0

,0,0

,7,0

,2,0

,0,0

,0,0

,8,0

,1,0

,0,0

,0,0

,7,0

,0,6

,0,0

,0,0

,]arr =[0

,6,4

,1,0

,9,3

,0,0

,0,3

,0,0

,0,0

,7,0

,0,0

,0,1

,0,0

,2,0

,0,0

,3,0

,9,7

,4,5

,0,0

,0,6

,4,8

,0,1

,0,5

,2,7

,0,5

,0,0

,8,0

,0,3

,0,7

,8,5

,3,2

,4,1

,0,6

,2,9

,5,8

,5,0

,0,7

,0,4

,1,0

,6,9

,0,2

,0,8

] my_solution = solution(

) my_solution.solve(arr)

回溯法解數獨

前天在我的小pad上裝了個數獨遊戲,完了幾把後興趣索然了。不過突然想起來一直想寫個解數獨的程式,不過因為懶和拖拉,就一直沒寫。今天花了30分鐘寫了個解數獨的程式,貼 include include include 某個數字填入後,需要檢查的index void get affected index ...

leetcode 解數獨 回溯法

如 方法 回溯法 回溯法的思想就是 對於乙個問題有多個選擇方式,先選擇乙個方式執行下去,若在執行過程中,發現不符合規則,則回退,回到選擇方式的步驟,進而選擇其他方式,繼續試。重要 對於回溯法,一定會有個 規則 這個 規則 將會決定是否回退,所以當我們在使用回溯法時,一定要留意能否構建 規則 如這一題...

解數獨(深搜 回溯)

本題hard難度但是解體思路就是很普通的深搜 回溯 需要考慮的點是遞迴的深搜進行的條件和狀態的記錄 用boolean陣列來記錄每個行 列 九宮格裡1 9的存在情況 先遍歷一次原陣列,記錄空格的位置並對boolean陣列進行初始化 然後對空格位置進行dfs。class solution else df...