原题:
解决方法:
代码:
Write a program to solve a Sudoku puzzle by filling the empty cells.
Empty cells are indicated by the character '.'
.
You may assume that there will be only one unique solution.
A sudoku puzzle...
...and its solution numbers marked in red.
解决方法:
千万别被这道题给吓住了,其实就是一个暴力破解的过程,不需要用到解九宫格的任何优化算法,跟AI更不搭边。当然,如果愿意你也可以自己用上。
解九宫格过程:
- 从第一个格开始,输入符合要求的数。
- 如果最终的答案符合要求,则直接返回了,否则尝试下一个有效的数。
- 当列标到达9时,尝试下一行。
- 当行标到达9时表明整个九宫格已解。
代码:
bool isValid(vector<vector<char>>& board, int row, int col, char val){
for(int i = 0; i < 9; i++){
if (board[i][col] == val )
return false;
}
for(int j = 0; j < 9; j++){
if (board[row][j] == val)
return false;
}
row = (row / 3) * 3;
col = (col / 3) * 3;
for(int i = 0; i < 3; i++){
for(int j = 0; j < 3;j++){
if (board[i + row][j + col] == val)
return false;
}
}
return true;
}
bool dfs(vector<vector<char>>& board, int row, int col){
if (col >= 9){
return dfs(board, row + 1, 0);
}
if(row >= 9){
return true;
}
if (board[row][col] != '.'){
return dfs(board, row, col + 1);
}
for(char i = '1'; i <= '9';i++){
if (!isValid(board, row, col, i))
continue;
board[row][col] = i;
if(dfs(board, row, col + 1))
return true;
board[row][col] = '.';
}
return false;
}
void solveSudoku(vector<vector<char>>& board) {
dfs(board, 0, 0);
}