确保数独的初始状态是否有效,同一行,同一列,一个九宫格内1-9只能出现一次。
使用三个二维表格table_row,table_col,table_cube分别记录行,列,九宫格是否出现相同元素。初始化为0。
table_row的第一行表示board的第一行元素,table_row[i][j] = 1,表示第i行值为j 已经出现过。
table_col的第一行表示board的第一列元素,table_col[i][j] = 1.表示第i列值为j 已经出现过
就九宫格记为
0 1 2
3 4 5
6 7 8
table_cube的第k行表示board的第个k宫格 ,table_cube[i][j] = 1 ,表示第i个九宫格值为j 已经出现过。
九宫格下标转为标号: 假设board[i][j]-->(i/2*)3+j/3。
class Solution {
public:
bool isValidSudoku(vector<vector<char>>& board) {
const int ROW = 9,COL=9;
//使用三个表分别记录行,列,九宫格是否重复出现。
int table_row[ROW][COL],table_col[ROW][COL],table_cube[ROW][COL];
//初始化为0
for(int i=0;i<ROW;++i){
for(int j=0;j<COL;++j){
table_row[i][j]=table_col[i][j]=table_cube[i][j]=0;
}
}
for(int i=0;i<ROW;++i){
for(int j=0;j<COL;++j){
int num = 0;
if(board[i][j]=='.') continue;
else
num = board[i][j]-'0'-1;
if(table_row[i][num]==0 && table_col[j][num]==0
&& table_cube[(i/3)*3+j/3][num]==0){
//^^^^^^^^^^^ 将就九宫格转换为对应的行。
table_row[i][num] = 1;
table_col[j][num] = 1;
table_cube[(i/3)*3+j/3][num] = 1;
}else{
return false;
}
}
}
return true;
}
};