#include<stdio.h>
#define n 9
int k[n][n];
int z[n][n];
int o;
int stop;
void put()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++){
printf("%d",z[i][j]);
}
printf("\n");
}
}
int judge1(int k,int i,int j)
{
int m;
for(m=0;m<n;m++){
if(z[m][j]==k&&m!=i){
return 0;
}
if(z[i][m]==k&&m!=j){
return 0;
}
}
return 1;
}
int judge2(int k,int i,int j)
{
int a,c;
a=i;
c=j;
while(a%3!=0){
a--;
}
while(c%3!=0){
c--;
}
int x,y;
int count[n+1]={
0}
;
for(x=a;x<a+3;x++)
{
for(y=c;y<c+3;y++)
{
if(x==i&&y==j){
count[k]++;
}
else{
count[z[x][y]]++;
}
}
}
for(x=1;x<n+1;x++){
if(count[x]>1){
return 0;
}
}
return 1;
}
int check()
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(z[i][j]){
if(judge1(z[i][j],i,j)==0){
return 0;
}
if(judge2(z[i][j],i,j)==0){
return 0;
}
}
}
}
return 1;
}
void solve(int i)
{
if(stop){
return;
}
int p,q,m;
p=i/n;
q=i%n;
if(i==n*n){
printf("答案%d:\n",o);
o++;
put();
if(o==8){
stop=1;
printf("仅展示前7个所得解\n");
}
}
else if(k[p][q]!=0){
solve(i+1);
}
else{
for(m=1;m<n+1;m++)
{
if(judge1(m,p,q)&&judge2(m,p,q)){
z[p][q]=m;
solve(i+1);
if(stop){
return;
}
z[p][q]=0;
}
}
}
}
int main()
{printf("请输入一个数独,未知用0替代\n\n");
stop=0;
char t[n][n];
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++){
scanf(" %c",&t[i][j]);
z[i][j]=k[i][j]=t[i][j]-48;
}
}
if(check())
{
o=1;
solve(0);
if(o==1){
printf("无解");
}
}
else{
printf("输入存在错误");
}
}