题目大意
数独规则点这里
注意可以有格子是空的。空的格子用“.”表示。
方法一.位运算
知道了这个之后,就很好办啦。因为数字只有九个,而且不允许重复出现。直接想到位运算!表示当前数字,只需要把1向右移动当前数字位。然后设置一个状态变量,存储当前有多少数字出现过。把他们相与,如果为0说明此数字还没出现过,就更新这个状态变量,即把他们做或运算。
计算3*3格子的时候参考了别人的代码,想法很巧妙,直接两重循环搞定。
bool isValidSudoku(char** board, int boardRowSize, int boardColSize) {
int i,j,k;
int block, column, row, num,flag;
for(i = 0; i<9; i++){
column = 0;
row = 0;
block = 0;
for(j = 0; j<9; j++){
if(board[i][j] != '.'){
num = board[i][j] - '0';
flag = 1 << num;
if((row & flag) == 0)
row |= flag;
else
return false;
}
if(board[j][i] != '.'){
num = board[j][i] - '0';
flag = 1 << num;
if((column & flag) == 0)
column |= flag;
else
return false;
}
int x = i / 3 * 3 + j / 3;
int y = i % 3 * 3 + j % 3;
if(board[x][y]!='.'){
num = board[x][y] - '0';
flag = 1 << num;
if((block & flag) == 0)
block |= flag;
else
return false;
}
}
}
return true;
}
方法二.STL-set
看下面有人用set,把代码粘了过来。复习下set的用法。
class Solution {
public:
bool check(set<char>& dc, char x) {
if (dc.count(x)) return false;
if (x != '.') dc.insert(x);
return true;
}
bool isValidSudoku(vector<vector<char>>& board) {
// each col / row
for (int i = 0; i < 9; i++) {
set<char> dc1, dc2;
for (int j = 0; j < 9; j++) {
if (!check(dc1, board[i][j])) return false;
if (!check(dc2, board[j][i])) return false;
}
}
// each block
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++) {
set<char> dc;
for (int k = 0; k < 3; k++)
for (int m = 0; m < 3; m++)
if (!check(dc, board[3 * i + k][3 * j + m])) return false;
}
return true;
}
};