题目
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.
解析
题意:解一个数独,假设必定有一个解
思路:用回溯法(即试探法),与平常我们玩数据是一样的思路
* 每填入一个数字用check函数判断是否合理
* 试探的填入下一个数组,如果不合理返回至上一步
主循环是从第一个数字遍历至最后一个数字
需注意使用回溯法试探时,一般需要一个新的函数且该函数有返回值
代码
时间复杂度:O(n²)
class Solution {
public:
void solveSudoku(vector<vector<char>>& board){
solveSudoku(board,0);
}
bool solveSudoku(vector<vector<char>>& board,int position) {
if(position==81)
return true;;
int row=position/9;
int col=position%9;
if(board[row][col]=='.'){
for(int k=1;k<=9;k++){
board[row][col]=(char)('0'+k);
if(checkvalid(board,position))
if(solveSudoku(board,position+1))
return true;
board[row][col]='.';
}
}
else
if(solveSudoku(board,position+1))
return true;
return false;
}
bool checkvalid(vector<vector<char>>& board,int position){
int row=position/9;
int col=position%9;
int k=row/3*3+col/3;
int target=board[row][col];
for(int i=0;i<9;i++){
if(i!=col&&board[row][i]==target) return false;
if(i!=row&&board[i][col]==target) return false;
}
int beginx=k/3*3;
int beginy=k%3*3;
for(int x=beginx;x<beginx+3;x++){
for(int y=beginy;y<beginy+3;y++){
if(x!=row&&y!=col&&board[x][y]==target)
return false;
}
}
return true;
}
};