rendered paste body#include<stdio.h>
#include<iostream>
using namespace std;
struct node
{
int i,j,n;
int row[9],column[9],block[9];
int possiblities[10];
int score,h,g;
};
void initialize();
void score();
void inpt();
int calculation();
void print();
int isemp();
node a[9][9];
int arr[9][9];
int main()
{
int i=0;
inpt();
initialize();
i=calculation();
print();
cout<<i;
cin>>i;
return 0;
}
void inpt()
{
int i,j;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cin>>arr[i][j];
}
}
}
void initialize()
{
int x,b1,b2,dist;
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
a[i][j].g=a[i][j].h=a[i][j].score=0;
for(int k=0;k<9;k++)
{
a[i][j].row[k]=a[i][j].column[k]=a[i][j].block[k]=0;
}
for(int k=1;k<10;k++)
{
a[i][j].possiblities[k]=0;
}
}
}
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
x=arr[i][j];
a[i][j].n=x;
if(x!=0)
{
for(int k=0;k<9;k++)
{
a[k][j].possiblities[x]=1;
a[i][k].possiblities[x]=1;
a[i][k].row[j]=1;
a[j][k].column[i]=1;
}
b1=i-i%3;
b2=j-j%3;
dist=(i%3)*3+(j%3);
for(int l=b1;l<b1+3;l++)
for(int m=b2;m<b2+3;m++)
{
if(l!=i&&m!=j)
{
a[l][m].possiblities[x]=1;
a[l][m].block[dist]=1;
}
}
}
}
}
score();
}
void score()
{
for(int i=0;i<9;i++)
for(int j=0;j<9;j++)
{
for(int k=1;k<10;k++)
{
a[i][j].h=a[i][j].h+a[i][j].possiblities[k];
a[i][j].g=a[i][j].g+a[i][j].row[k]+a[i][j].column[k]+a[i][j].block[k];
}
a[i][j].h=9-a[i][j].h;
a[i][j].g=20-a[i][j].g;
a[i][j].score=a[i][j].h+a[i][j].g;
}
}
int isemp()
{
int i,j,flag=1;
for(i=0;i<9;i++)
{
for(j=0;j<9;j++)
{
if(arr[i][j]==0)
{
flag=0;
break;
}
}
}
return flag;
}
int calculation()
{
int err=0,i=0,done=0,j=0,xmin=0,ymin=0,min=100;
for(i=0;i<=8;i++)
{
for(j=0;j<=8;j++)
{
if(a[i][j].n==0&&a[i][j].score<min)
{
xmin=i;
ymin=j;
min=a[i][j].score;
}
}
}
for(int k=1;k<10;k++)
{
if(a[xmin][ymin].possiblities[k]==0)
{
arr[xmin][ymin]=k;
initialize();
done=isemp();
if(done==0)
{
err=calculation();
if(err==0)
{
arr[xmin][ymin]=0;
initialize();
}
else
return 1;
}
else
return 1;
}
}
return 0;
}
void print()
{
for(int i=0;i<9;i++)
{
for(int j=0;j<9;j++)
{
cout<<a[i][j].n<<"\t";
}
cout<<"\n";
}
}