判斷乙個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 宮內只能出現一次。上圖是乙個部分填充的有效的數獨。數獨部分空格內已填入了數字,空白格用 表示。示...