题目
判断一个 9x9 的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。
数字 1-9 在每一行只能出现一次。
数字 1-9 在每一列只能出现一次。
数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。
int rowcheck(char **board, int len, int row) {
int flag[10] = {0};
for (int i = 0; i < len; i++) {
if (board[row][i] == '.') continue;
if (flag[board[row][i] - '0']) return 0;
flag[board[row][i] - '0'] = 1;
}
return 1;
}
int colcheck(char **board, int len, int col) {
int flag[10] = {0};
for (int i = 0; i < len; i++) {
if (board[i][col] == '.') continue;
if (flag[board[i][col] - '0']) return 0;
flag[board[i][col] - '0'] = 1;
}
return 1;
}
int boardcheck(char **board, int row, int col) {
int flag[10] = {0};
int m = 0, n;
while (m < 3) {
n = 0;
while (n < 3) {
if (board[row][col] == '.') {n++; col++; continue;}
if (flag[board[row][col] - '0']) return 0;
flag[board[row][col] - '0'] = 1;
n++; col++;
}
col -= 3;
m++; row++;
}
return 1;
}
bool isValidSudoku(char** board, int boardSize, int* boardColSize){
int flag;
for (int i = 0; i < boardSize; i++) {
flag = rowcheck(board, boardSize, i);
if (flag == 0) return false;
}
for (int i = 0; i < boardSize; i++) {
flag = colcheck(board, boardSize, i);
if (flag == 0) return false;
}
int i = 0, j = 0, m = 0, n = 0;
while (m < 3) {
j = 0;
n = 0;
while (n < 3) {
flag = boardcheck(board, i, j);
if (flag == 0) return false;
j += 3;
n++;
}
i += 3;
m++;
}
return true;
}