题目:解数独
题意:给定一个9*9的不完全数独矩阵,需要在 ‘.’ 的地方填入合适的数字(1-9),使得每一行、每一列以及每一个子方块没有重复的数字出现
思路:回溯
对每一行、每一列以及每一个子方块设置一个标志数组,标志已经存放过哪些数字。从矩阵的第一个格开始处理,直到最后一个格结束。
代码:
class Solution {
private:
int flag[3][9][10]; //0记录行 1记录列 2记录子迷宫
int N = 9;
public:
void solveSudoku(vector<vector<char>>& board) { //初始化标志数组
memset(flag, 0, (3 * 9 * 10) * sizeof(int));
for(int i = 0; i < N; i++)
for (int j = 0; j < N; j++) {
if (board[i][j] != '.') {
int k = i / 3 * 3 + j / 3;
int temp = board[i][j] - '0';
flag[0][i][temp]++;
flag[1][j][temp]++;
flag[2][k][temp]++;
}
}
backtracking(board, 0, 0);
}
bool backtracking(vector<vector<char>>& board, int row, int col) {
if (col == N) {
row++;
col = 0;
if (row == N)
return true; //如果所有的'.'已经全部填入数字,则返回True
}
if (board[row][col] == '.') {
for (int i = 1; i <= N; i++) {
int k = row / 3 * 3 + col / 3;
if (!(flag[0][row][i] || flag[1][col][i] || flag[2][k][i])) {
flag[0][row][i]++;
flag[1][col][i]++;
flag[2][k][i]++;
board[row][col] = '0' + i;
if (backtracking(board, row, col + 1))return true;
board[row][col] = '.';
flag[0][row][i]--;
flag[1][col][i]--;
flag[2][k][i]--;
}
}
return false;
}
return backtracking(board, row, col + 1);
}
};