#include <stdio.h>

char mo = 0;
char tabla[9][9];

int joe(){
 int i, j, k, L1, L2;
 char ind[9] = {0, 0, 0, 0, 0, 0, 0, 0, 0};

 for(i=0; i<9; i++){ //sorok
  for(j=0; j<9; j++){
   if(tabla[i][j] != 0 && ind[tabla[i][j]-1]>0) return 0;
   else ind[tabla[i][j]-1] = 1;
  }
  for(k=0; k<9; k++) ind[k] = 0;
 }

 for(i=0; i<9; i++){ //oszlopok
  for(j=0; j<9; j++){
   if(tabla[j][i] != 0 && ind[tabla[j][i]-1]>0) return 0;
   else ind[tabla[j][i]-1] = 1;
  }
  for(k=0; k<9; k++) ind[k] = 0;
 }

 for(i=0; i<3; i++) //negyzetek
  for(j=0; j<3; j++){
   for(L1=0; L1<3; L1++)
    for(L2=0; L2<3; L2++){
     if(tabla[i*3+L1][j*3+L2] != 0 && ind[tabla[i*3+L1][j*3+L2]-1]>0) return 0;
     else ind[tabla[i*3+L1][j*3+L2]-1] = 1;
    }
   for(k=0; k<9; k++) ind[k] = 0;
  }
  
 return 1;
}

void kitolt(int empty){ // a lenyeges resz
 int k; // k a probalando szam
 int i, j;
 
 for(i=0; i<9; i++)
  for(j=0; j<9; j++) 
   if(tabla[i][j] == 0) goto kezd;
  
 kezd:
 for(k=1; k<=9; k++){
  tabla[i][j] = k;
  if(joe() == 1){
   if(empty == 1){
	if(mo == 0){ // kiirjuk az elso megoldast
	  for(i=0; i<9; i++){
       for(j=0; j<9; j++)
        printf("%d ", tabla[i][j]);
	   printf("\n");
	  }
	}
	mo++;
	if(mo > 1){ // ha tobb a megoldas akkor nem kell folytatni
	 printf("A megoldas nem egyertelmu");
	 exit(0); 
	}
   }
   else kitolt(empty-1);
  }
 }
 tabla[i][j] = 0;
 return;
}

int main(int argc, char *argv[])
{
 char temp;
 int i, j, empty = 0;

 FILE *f = fopen(argv[1], "rt");
  for(i=0; i<9; i++){ 
   for(j=0; j<9; j++){
	 fscanf(f, "%c", &temp);
	 if(temp == '.'){
	  tabla[i][j] = 0;
	  empty++;
	 }
	 else tabla[i][j] = temp - 48;
   }
   fscanf(f, "%c", &temp);
  }
 fclose(f);

 kitolt(empty);

 if(mo == 0) printf("Nincs megoldas");
}
