题意:
判断一个数阵是否可以数独
我的解法(慢):
Point:
写这个我遇到了一个非常大的问题,就是关于容器的容器的初始化问题,代码中:
//必须要这么初始化才可以在后面使用
vector<char> temp;
vector<vector<char>> col(9,temp);
vector<vector<char>> group(9,temp);
// 要好好研究一下 vector 的初始化问题了
class Solution {
public:
bool isValidSudoku(vector< vector<char> >& board) {
int size = 9;
vector<char> temp;
vector<vector<char>> col(9,temp);
vector<vector<char>> group(9,temp);
for (int i=0; i<size;i++){
for(int j=0; j<size;j++){
char temp = board[i][j];
col[j].push_back(temp);
group[(i/3*3)+j/3].push_back(temp);
}
}
// judge if Valid
return judge(board) && judge(col) && judge(group);
}
bool judge(vector<vector<char>>& nums){
int size = 9;
for (int i=0; i<size;i++){
set<char> s;
for(int j=0; j<size;j++){
if(nums[i][j]!='.') {
if(s.count(nums[i][j]) == 0) s.insert(nums[i][j]);
else return false;
}
}
}
return true;
}
};
更快,更牛逼的java算法
这个位运算我给满分
public boolean isValidSudoku(char[][] board) {
int [] vset = new int [9];
int [] hset = new int [9];
int [] bckt = new int [9];
int idx = 0;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
if (board[i][j] != '.') {
idx = 1 << (board[i][j] - '0') ; // << 位操作,左移某数位
if ((hset[i] & idx) > 0 ||
(vset[j] & idx) > 0 ||
(bckt[(i / 3) * 3 + j / 3] & idx) > 0) return false;
hset[i] |= idx; // a |= b 即是 a = a|b
vset[j] |= idx;
bckt[(i / 3) * 3 + j / 3] |= idx;
}
}
}
return true;
}