1、呼叫sudokumaker()
初始化數獨建立例項
2、例項呼叫setsudimaker()
可以建立乙個數獨, 引數為難度, 選填1-30,每+1會增加兩個空
3、例項呼叫getarr()
獲取數獨,為乙個二元陣列, 為 0 的地方表示此處為空
4、例項呼叫getanswer()
獲取一種數獨答案,同樣為乙個二元陣列
5、例項呼叫iswrong()
上傳數獨答案,會返回第乙個錯誤的位置,沒有錯誤則返回false
import random, copy
class
sudokumaker()
: def setsudomaker
(self, grade)
: self.grade = grade
self.arr =[[
0]*9
for i in range(9
)] self.sodoku =[[
0]*9
for i in range(9
)] self.game =[[
0]*9
for i in range(9
)]self.answer =[[
0]*9
for i in range(9
)] self.
rand(15
) self.
dfs(self.arr,0)
self.
diger
(grade)
def rand
(self, num)
: t =
0while num:
x = random.
randint(0
,8) y = random.
randint(0
,8) n = random.
randint(1
,9)if
(self.arr[x]
[y]==0)
& self.
istrue
(x, y, n, self.arr)
: self.arr[x]
[y]= n
num -=
1 def istrue
(self, x, y, n, array)
: a =(0
if(x <3)
else3)
if(x <6)
else
6 b =(0
if(y <3)
else3)
if(y <6)
else
6for i in range
(a, a +3)
:for j in range
(b, b +3)
:if array[i]
[j]== n:
return false
for i in range(9
):if(array[x]
[i]== n)
|(array[i]
[y]== n)
:return false
return true
flag = false
def dfs
(self, array, deepth)
:if deepth <81:
if self.flag:
return
if array[
int(deepth /9)
][deepth %9]
==0:for i in range(1
,10):
if self.
istrue
(int
(deepth /9)
, deepth %
9, i, self.arr)
: array[
int(deepth /9)
][deepth %9]
= i self.
dfs(array, deepth +1)
array[
int(deepth /9)
][deepth %9]
=0else
: self.
dfs(array, deepth +1)
else
: self.flag = true
self.sodoku = copy.
deepcopy
(array)
self.answer = copy.
deepcopy
(array)
def getdignumber
(self, grade):if
(grade <=30)
&(grade >=1)
:return grade *
2else
:return
7 def diger
(self, grade)
: t =
int(self.
getdignumber
(grade)
)while t:
x = random.
randint(0
,8) y = random.
randint(0
,8)if self.sodoku[x]
[y]!=0:
self.sodoku[x]
[y]=
0 t -=
1 self.game = copy.
deepcopy
(self.sodoku)
def getarr
(self)
:return self.game
def getanswer
(self)
:return self.answer
def iswrong
(self, array)
:for i in range(9
):for j in range(9
):if self.
getarr()
[i][j]==0
: temp = array[i]
[j] array[i]
[j]=
0if not self.
istrue
(i, j, temp, array)
:return
(i,j)
array[i]
[j]= temp
return false
def main()
:"""
說明:1、呼叫sudokumaker
()初始化數獨建立例項
2、例項呼叫setsudimaker
()可以建立乙個數獨, 引數為難度, 選填1
-30,每+
1會增加兩個空
3、例項呼叫getarr
()獲取數獨,為乙個二元陣列, 為 0 的地方表示此處為空
4、例項呼叫getanswer
()獲取一種數獨答案,同樣為乙個二元陣列
5、例項呼叫iswrong
()上傳數獨答案,會返回第乙個錯誤的位置,沒有錯誤則返回false
"""# 示例**
mkr =
sudokumaker()
mkr.
setsudomaker(30
)print
(mkr.
getarr()
)print
(mkr.
getanswer()
) a =[[
1,3,
4,5,
7,8,
6,9,
2],[
7,2,
8,6,
1,9,
3,4,
5],[
6,9,
5,3,
4,2,
7,1,
8],[
4,7,
1,8,
3,5,
2,6,
9],[
3,5,
6,2,
9,1,
4,8,
7],[
9,8,
2,4,
6,7,
5,3,
1],[
2,4,
7,1,
8,3,
9,5,
6],[
5,1,
3,9,
2,6,
8,7,
4],[
8,6,
9,7,
5,4,
1,2,
3]]print
(mkr.
iswrong
(a))
if __name__ ==
"__main__"
:main
()
缺點:10次生成有一次會生成失敗,這是python本身的缺陷,不能遞迴1000次。 python 數獨 Python中的數獨檢查器
我正在嘗試用python建立乙個數獨檢查器 ill formed 5,3,4,6,7,8,9,1,2 6,7,2,1,9,5,3,4,8 1,9,8,3,4,2,5,6,7 8,5,9,7,6,1,4,2,3 4,2,6,8,5,3,7,9 7,1,3,9,2,4,8,5,6 9,6,1,5,3,7...
36 有效的數獨 Python
判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格用 表示。示例 1 輸入 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 輸...
LeetCode 有效的數獨(python)
題目 判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。上圖是乙個部分填充的有效的數獨 數獨部分空格內已填入了數字,空白格用 表...