#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
int map[9][9];
void show(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
printf("%d ",map[i][j]);
}
printf("\n");
}
}
int isok(int x,int y,int n){
int xx,yy,i,j;
xx=x/3*3;
yy=y/3*3;
for(i=0;i<9;i++){
if(map[x][i]==n||map[i][y]==n)
return 0;
}
for(i=xx;i<xx+3;i++){
for(j=yy;j<yy+3;j++){
if(map[i][j]==n)
return 0;
}
}
return 1;
}
void fun(int x,int y){
if(x>=9&&y==0){
show();
}else if(map[x][y]!=0){
if(y+1==9)
fun(x+1,0);
else
fun(x,y+1);
}else{
//候选数方法
int n,m,i,j;
int num[10];
n=x/3*3;
m=y/3*3;
for(i=1;i<10;i++) //初始化数组
num[i]=0;
for(i=0;i<9;i++){
if(map[x][i]!=0)
num[map[x][i]]=1;
}
for(i=0;i<9;i++){
if(map[i][y]!=0)
num[map[i][y]]=1;
}
for(i=n;i<n+3;i++){
for(j=m;j<m+3;j++){
if(map[i][j]!=0)
num[map[i][j]]=1;
}
}
for(i=1;i<=9;i++){
if(num[i]==0){
map[x][y]=i;
if(y+1==9){
fun(x+1,0);
}else{
fun(x,y+1);
}
map[x][y]=0;
}
/*
if(isok(x,y,i)){ //另一种方法
map[x][y]=i;
if(y+1==9){
fun(x+1,0);
}else{
fun(x,y+1);
}
map[x][y]=0;
}
*/
}
}
}
int main(){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++){
scanf("%1d",&map[i][j]);
}
}
printf("\n");
fun(0,0);
return 0;
}
代码测试: