- 这种填数字的都是回溯。
- 可以使用整除的方式然后*法的方式定位到边界。
- 最终回溯复原,是指我在本次,所有选择和对应业务都处理完之后(有时候是没法返回true的时候),就复原(此时返回false,因为所有选择都做完了)。
#include<bits/stdc++.h>
using namespace std;
bool check(vector<vector<int>> res, int i, int j){
//同行
for(int k = 0; k< 9;k++){
if(res[i][j]==res[i][k]&&j!=k){
return false;
}
}
//同列
for(int k = 0; k< 9;k++){
if(res[i][j]==res[k][j]&&i!=k){
return false;
}
}
//3x3区域
int top = i/3*3;
int left = j/3*3;
for(int t = top; t<top+3;t++ ){
for(int l = left; l < left+3;l++){
if((t!=i||l!=j)&&res[i][j]==res[t][l]){
return false;
}
}
}
return true;
}
bool DFS(vector<vector<int>>& res, int i, int j){
//base case
if(i==9){//全部遍历完成
return true;
}
//入口
if(res[i][j]==0){
for(int k = 1; k<=9; k++){
res[i][j] = k;
if(check(res,i,j)&&DFS(res, j==8? i + 1:i, j==8? 0:j+1)){//从左到右,从上到下进行尝试
return true;
}
}
res[i][j] = 0;//尝试完成之后
return false;
}else{
return DFS(res, j==8? i + 1:i, j==8? 0:j+1);//就看下一步
}
}
int main(){
vector<vector<int>> res(9, vector<int>(9,0));
int a =0;
for(int i=0; i< 9; i++){
for(int j=0; j< 9; j++){
cin>>a;
res[i][j] = a;
}
}
DFS(res,0,0);
for(int i=0; i< 9; i++){
for(int j=0; j< 9; j++){
if(j!=8){
cout<<res[i][j]<<" ";
}else{
cout<<res[i][j]<<endl;
}
}
}
return 0;
}