具体解析在代码中
#include<iostream>
#include<string>
using namespace std;
int num[9][9];
bool flag = false;
void print()
{
for (int i = 0; i < 9; i++){
for (int j = 0; j < 9; j++){
cout << num[i][j] << " ";
if (j % 3 == 2){
cout << " ";
}
}
cout << endl;
if (i % 3 == 2){
cout << endl;
}
}
}
void init(){
string s;
for(int i = 0;i < 9;i++){
cin>>s;
cout<<s<<endl;
for(int j = 0;j < s.length();j++){
num[i][j] = s[j] - '0';
}
}
}
bool check(int n,int key){
int x = n / 9;//该点x坐标
int y = n % 9;//该点y坐标
//检查该行是否存在相同值
for(int i = 0;i < 9;i++){
if(num[x][i] == key){
return false;
}
}
//检查该列是否存在相同值
for(int i = 0;i < 9;i++){
if(num[i][y] == key){
return false;
}
}
x = (x/3)*3;//所在3*3小格左上角x左边
y = (y/3)*3;//所在3*3小格左上角y左边
for(int i = 0;i < 3;i++){
for(int j = 0;j < 3;j++){
if(num[x+i][y+j] == key){//判断是否存在相同数值
return false;
}
}
}
return true;//不存在不合法情况,视为可以填入
}
void dfs(int n){
if(n > 80){
flag = true;//已经全部填满
return ;
}
if(num[n / 9][n % 9] > 0){//该点已经填入数值了,填写下一个
dfs(n+1);
}else{
for(int i = 1;i <= 9;i++){
if(check(n,i)){
num[n / 9][n % 9] = i;//将数值填入
dfs(n+1);
if(flag){
return ;
}
num[n / 9][n % 9] = 0;//这一步一定要有,将数值放入的数值取出
}
}
}
}
int main(){
/*
900050060
020070100
300102040
703800529
000345000
516009403
050208006
007090010
030010004
*/
init();
dfs(0);
print();
return 0;
}