36 有效的數獨 Python

2021-10-08 22:30:42 字數 4099 閱讀 8503

判斷乙個 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"]

]輸出:

true

示例 2

:輸入:[[

"8",

"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"]

]輸出:

false

解釋: 除了第一行的第乙個數字從 5 改為 8 以外,空格內其他數字均與 示例1 相同。

但由於位於左上角的 3x3 宮內有兩個 8 存在, 因此這個數獨是無效的。

說明:

該題雖然為數獨問題,但是並不要求找到它對應的可行解,而只需要判斷當前給出的數獨棋盤是否合法,即此時是否滿足三條規則。由於棋盤可分為如下的九個方格,那麼每個方格都可以使用它左上角的座標表示。在判斷的流程中,我們使用逐個方格的方式進行判斷,為了便於判斷某個格仔中的數字是否違反了規則,定義如下的資料結構:

python解題**如下:

class

solution

:def

__init__

(self)

:# 用於記錄0 - 8 行,每一行的字元

self.rows =

# 用於記錄0 - 8 列,每一列的字元

self.cols =

// 初始化rows和cols的值為list形式

for i in

range(0

,9):

self.rows[

"{}"

.format

(i)]=[

] self.cols[

"{}"

.format

(i)]=[

]def

helpers

(self, board, row, col)

->

bool

:# 用於儲存某個方格中的字元

blog =

# 每個方格都是 3 * 3 大小

for i in

range(0

,3):

for j in

range(0

,3):

ch = board[row + i]

[col + j]

r = self.rows.get(

"{}"

.format

(row + i)

) c = self.cols.get(

"{}"

.format

(col + j)

)# 如果當前位置所在的行、列或者方格中已有該字元,直接返回false

if ch !=

'.'and ch in r or ch !=

'.'and ch in c or ch!=

'.'and ch in blog:

return

false

# 否則儲存當前字元,便於後續判斷

else

: self.rows[

"{}"

.format

(row + i)

] self.cols[

"{}"

.format

(col + j)

]return

true

defisvalidsudoku

(self, board)

->

bool

:# 這裡以3為步長,正好可以表示每個方格的左上角座標

for row in

range(0

,7,3

):for col in

range(0

,7,3

):r = self.helpers(board, row, col)

if r ==

false

:return

false

else

:continue

return

true

36 有效數獨

判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。對於每乙個遍歷到的當前元素,需要知道該元素是否之前已在該行,該列,該小方陣裡出...

36 有效的數獨

判斷乙個 9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字 1 9 在每一行只能出現一次。數字 1 9 在每一列只能出現一次。數字 1 9 在每乙個以粗實線分隔的 3x3 宮內只能出現一次。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格用 表示。示...

36 有效的數獨

判斷乙個9x9的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。數字1 9在每一行只能出現一次。數字1 9在每一列只能出現一次。數字1 9在每乙個以粗實線分隔的3x3宮內只能出現一次。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格用 表示。輸入 5 3 7 6 ...