Leecode 36
思路:
最简单暴力方法,三次便利,按行,按列,按小块。另外一种方法,一次便利,用三个hash表记录分别记录行、列、块。然后看如果出现的次数多于一次,那么返回false。
代码://貌似有点问题
bool Leecode36_isValidSudoku(std::vector<std::vector<char>>& board) {
std::vector<std::map<int, int>> rows;
std::vector<std::map<int, int>> columns;
std::vector<std::map<int, int>> boxes;
for (int i = 0; i < 9; i++) {
for (int j = 0; j < 9; j++) {
char nums = board[i][j];
if (nums != '.') {
int num = nums - '0';
int box_index = (i / 3) * 3 + j / 3;
bool flag = false;
rows[i].count(num) > 0 ? flag = true : rows[i][num] = 1;
columns[j].count(num) > 0 ? flag = true : columns[j][num] = 1;
boxes[box_index].count(num) > 0 ? flag = true : boxes[box_index][num] = 1;
if (flag)
return false;
}
}
}
return true;
}
另外变种做法:
bool Leecode36_isValidSudoku(std::vector<std::vector<char>>& board) {
int xbl[9][9] = {0};
int ybl[9][9] = {0};
int wbl[9][9] = {0};
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
if(board[i][j] == '.') continue;
if(++xbl[i][board[i][j]-'1']>1) return false; //行位置计数
if(++ybl[j][board[i][j]-'1']>1) return false; //列位置计数
if(++wbl[i/3*3+(board[i][j]-'1')/3][j/3*3+(board[i][j]-'1')%3]>1) return false; //块计数
}
}
return true;
}