有效的數獨

2021-10-23 13:35:33 字數 3220 閱讀 7312

判斷乙個9x9 的數獨是否有效。只需要根據以下規則,驗證已經填入的數字是否有效即可。

數字?1-9?在每一行只能出現一次。

數字?1-9?在每一列只能出現一次。

數字?1-9?在每乙個以粗實線分隔的?3x3?宮內只能出現一次。

上圖是乙個部分填充的有效的數獨。

數獨部分空格內已填入了數字,空白格用?』.』?表示。

示例?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 存在, 因此這個數獨是無效的。

說明:乙個有效的數獨(部分已被填充)不一定是可解的。

只需要根據以上規則,驗證已經填入的數字是否有效即可。

給定數獨序列只包含數字?1-9?和字元?』.』?。

給定數獨永遠是9x9形式的。

1.其實思路很簡單,根據題目要求我們可以發現其實是需要判斷三個條件:

(1)判斷每一行是否有重複字元

(2)判斷每一列是夠有重複字元

(3)判斷每乙個3*3九宮格是否存在重複

2.上面做法時間和記憶體消耗都會比較好,下面注釋的做法時間會和上面這種差不多,但是記憶體消耗會比下面的

這種做法小一些。

3.checkout[3 * (i / 3) + j / 3][num]這個操作其實就是判斷九宮格,但是雖然行是3,但是列是9

下面這種是最優解

#include

#include

#include

using

namespace std;

class

myclass

vectorint>>

checkout(9

,vector<

int>(9

,0))

; vectorint>>

row(

9, vector<

int>(9

,0))

; vectorint>>

col(

9, vector<

int>(9

,0))

;for

(int i =

0; i < board.

size()

;++i)}}

}return

true;}

};

下面這種方法比較好理解

bool

isvalidsudoku

(vectorchar

>>

& board)

//判斷每一列是否滿足

for(

int i=

0;i++i)

//判斷每乙個格仔是否滿足,每一次找到乙個九宮格的左上角位置,以次為基準開始判斷

for(

int i =

0; i)}

return

true;}

bool

isrowvalid

(int row, vectorchar

>>

& board)

//判斷單獨一行是否有效

//判斷最後push進的元素是否與前面的相同,因為是先push,後比較,所以要小於size()-1

for(

int j =

0; jsize()

-1;++j)

}return

true;}

bool

iscolumnvalid

(int column, vectorchar

>>

& board)

//判斷每一列是否有效

//判斷最後push進的元素是否與前面的相同,因為是先push,後比較,所以要小於size()-1

//之所以每次對比是因為這樣可以發現重複及時退出,而且這樣才能判斷有無重複,否則全部壓進去,

無法比較

for(int j =

0; jsize()

-1;++j)

}return

true;}

//判斷單獨乙個九宮格是否有效

bool

isninevalid

(int row,

int column, vectorchar

>>

& board)

for(

int k =

0; k < temp.

size()

-1;++k)}}

return

true

;}

有效的數獨

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

有效的數獨

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

有效的數獨

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