解数独
解数独
题目
编写一个程序,通过填充空格来解决数独问题。
数独的解法需遵循如下规则:
1.数字1-9在每一行只能出现一次。
2.数字1-9在每一列只能出现一次。
3.数字1-9在每个粗实线分割的3*3宫内只能出现一次。
数独部分空格内已经填入数字,空白格用'.'表示。
示例
![]() |
|---|
![]() |
解题思路
- 每一行数字分别1-9。
- 每一列数字分别1-9。
- 每3*3小方格数字填充也是1-9。
- 对每个空格依次填入数字1-9.
- 对于每次填充数字需要判断该数字是否满足条件。
- 若是不满住,则重新填充其他数字。
- 若是全不满足,则表示前面数字填充失误,进行回溯。
- 直到满足上述条件。
解题过程
- 编写函数,判断填充数字是否满足条件。
- 编写回溯函数
- 对算法进行验证,修改代码逻辑。
代码
class Solution {
public:
bool isgoodNumber(const vector<vector<char>>& borad, int row, int col, char number){
if(row >= 9 || col >= 9) return false;
for(int i = 0; i < 9; i++){
if(borad[row][i] == number || borad[i][col] == number) return false;
}
//判读对应的方格是否瞒住条件
int num1 = col / 3; // 8 2
int num2 = row / 3; // 0 0
for(int i = 0; i < 3; i++){
for(int k = 0; k < 3; k++){
if(borad[num2*3+i][num1*3+k] == number) return false;
}
}
return true;
}
bool findShudoku(vector<vector<char>>& board){
for(int i = 0; i < 9; i++){
for(int k = 0; k < 9; k++){
if(board[i][k] != '.') continue;
for(char c = '1'; c <= '9'; c++){
if(isgoodNumber(board, i, k, c)){
board[i][k] = c;
if(findShudoku(board)) return true ;
board[i][k] = '.';
}
}
return false;
}
}
return true;
}
void solveSudoku(vector<vector<char>>& board) {
findShudoku(board);
}
};



浙公网安备 33010602011771号