Copy
Input: board =
[["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"]]
Output: true
Copy
Input: board =
[["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"]]
Output: false
Explanation: Same as Example 1, except with the 5 in the top left corner being modified to 8. Since there are two 8's in the top left 3x3 sub-box, it is invalid.
Copy #include <algorithm>
#include <map>
enum SudokuBitmap
{
a1 = 1 << 1 ,
a2 = 1 << 2 ,
a3 = 1 << 3 ,
a4 = 1 << 4 ,
a5 = 1 << 5 ,
a6 = 1 << 6 ,
a7 = 1 << 7 ,
a8 = 1 << 8 ,
a9 = 1 << 9
};
map <char , SudokuBitmap > SudokuMap
{
{ '1' , a1} ,
{ '2' , a2} ,
{ '3' , a3} ,
{ '4' , a4} ,
{ '5' , a5} ,
{ '6' , a6} ,
{ '7' , a7} ,
{ '8' , a8} ,
{ '9' , a9}
};
class Solution
{
public :
bool isValidSudoku ( vector < vector < char >> & board)
{
short flags = 0 ;
const auto cell_is_invalid =
[ & flags , SudokuMap]( char a)
{
if ( ! (a == '.' || (a > '0' && a < '9' + 1 )) )
return true ;
if (flags & SudokuMap [a])
return true ;
flags |= SudokuMap [a];
return false ;
};
//check all rows
for ( auto row : board)
{
flags = 0 ;
bool invalid = count_if ( row . begin () , row . end () , cell_is_invalid);
if (invalid) return false ;
}
//check all columns
for ( unsigned i = 0 ; i < board . size (); ++ i)
{
flags = 0 ;
for ( unsigned j = 0 ; j < board . size (); ++ j)
if ( cell_is_invalid ( board [j][i]))
return false ;
}
//check every 3x3
for ( unsigned i = 0 ; i < board . size (); i += 3 )
for ( unsigned j = 0 ; j < board . size (); j += 3 )
{
flags = 0 ;
if (
cell_is_invalid ( board [i][j]) ||
cell_is_invalid ( board [i][j + 1 ]) ||
cell_is_invalid ( board [i][j + 2 ]) ||
cell_is_invalid ( board [i + 1 ][j]) ||
cell_is_invalid ( board [i + 1 ][j + 1 ]) ||
cell_is_invalid ( board [i + 1 ][j + 2 ]) ||
cell_is_invalid ( board [i + 2 ][j]) ||
cell_is_invalid ( board [i + 2 ][j + 1 ]) ||
cell_is_invalid ( board [i + 2 ][j + 2 ])
) return false ;
}
return true ;
}
};