创建三个二维数组
r
o
w
s
[
9
]
[
9
]
,
c
o
l
s
[
9
]
[
9
]
,
s
u
b
b
o
x
e
s
[
9
]
[
9
]
rows[9][9], cols[9][9], subboxes[9][9]
rows[9][9],cols[9][9],subboxes[9][9]
r
o
w
s
[
i
]
[
n
u
m
]
rows[i][num]
rows[i][num] 用来存放第
i
i
i 行
n
u
m
num
num 出现的次数,其他两个同理
有值大于
1
1
1 则返回
f
a
l
s
e
false
false
改进(数位哈希)
创建三个一维数组
r
o
w
s
[
9
]
,
c
o
l
s
[
9
]
,
s
u
b
b
o
x
e
s
[
9
]
rows[9], cols[9], subboxes[9]
rows[9],cols[9],subboxes[9]
若第
i
i
i 行第某个数是
5
5
5,则
r
o
w
s
[
i
]
=
r
o
w
s
[
i
]
∣
(
10000
)
rows[i] = rows[i] | (10000)
rows[i]=rows[i]∣(10000) (即第
5
5
5 位是
1
1
1,其余位是
0
0
0)
设第
i
i
i 行某列的数
n
u
m
num
num 对应的二进制为
B
B
B,若
r
o
w
s
[
i
]
与
B
>
0
rows[i] 与 B > 0
rows[i]与B>0,则表示
n
u
m
num
num 已经在第
i
i
i 行出现过,返回
f
a
l
s
e
false
false
代码
classSolution{public:boolisValidSudoku(vector<vector<char>>& board){// int rows[9][9] = {0};// int cols[9][9] = {0};// int subboxes[9][9] = {0};// for(int i = 0; i < 9; i++){// for(int j = 0; j < 9; j++){// if(board[i][j] == '.')// continue;// rows[i][board[i][j]-'0'-1]++;// cols[j][board[i][j]-'0'-1]++;// subboxes[int(i/3)*3+j/3][board[i][j]-'0'-1]++;// if(rows[i][board[i][j]-'0'-1]>1 || cols[j][board[i][j]-'0'-1]>1 ||subboxes[int(i/3)*3+j/3][board[i][j]-'0'-1]>1){// return false;// } // }// }// return true;//int rows[9]={0};int cols[9]={0};int subboxes[3][3]={0};for(int i =0; i <9; i++){for(int j =0; j <9; j++){if(board[i][j]!='.'){int x =1<<(board[i][j]-'1');if(rows[i]& x || cols[j]& x || subboxes[i /3][j /3]& x)returnfalse;
rows[i]|= x;
cols[j]|= x;
subboxes[i /3][j /3]|= x;}}}returntrue;}};