//badaneh******************************************* ********
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
int checknum(int,int ,int);
void slove(int ,int);
void error(int,int);
int sodoko[9][9];
int main()
{
clrscr();
int i,j;
for(i=0;i<9;i++){
for(j=0;j<9;j++)
sodoko[i][j]=0;
}
sodoko[0][0]=1,sodoko[0][2]=4,sodoko[0][4]=5,sodoko[2][2]=5,sodoko[2][3]=1;
sodoko[2][5]=2,sodoko[2][6]=9,sodoko[2][7]=7,sodoko[3][1]=4,sodoko[3][5]=5;
sodoko[3][8]=6,sodoko[4][3]=7,sodoko[4][5]=6,sodoko[5][0]=3,sodoko[5][3]=2;
sodoko[5][7]=9,sodoko[6][1]=6,sodoko[6][2]=8,sodoko[6][3]=5,sodoko[6][5]=9;
sodoko[6][6]=1,sodoko[8][4]=8,sodoko[8][6]=5,sodoko[8][8]=3;
slove(0,0);
getch();
return 0;
}
//slove********************************************* ****************
void slove(int sa,int so)
{
if (sodoko[sa][so]!=0){
if (sa==8 && so==8){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++)
printf("%4d",sodoko[i][j]);
printf("\n");}
getch();
exit(1);}
if (++so>8){
sa++;
so=0;}
slove(sa,so);}
else
for (int in=1;in<=9;in++){
if(checknum(sa,so,in)){
sodoko[sa][so]=in;
if(so==8 && sa==8){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++)
printf("%4d",sodoko[i][j]);
printf("\n");}
getch();
exit(1);}
if (++so>8){
sa++;
so=0;}
slove(sa,so);}}
error(sa,so);
}
//************************************************** **error
void error(int sa,int so)
{sodoko[sa][so]=0;
if (so==0){
sa--;
so=8;}
else
so--;
for (int in=sodoko[sa][so]+1;in<=9;in++){
if(checknum(sa,so,in)){
sodoko[sa][so]=in;
if(so==8 && sa==8){
for(int i=0;i<9;i++){
for(int j=0;j<9;j++)
printf("%4d",sodoko[i][j]);
printf("\n");}
getch();
exit(1);}
if (++so>8){
sa++;
so=0;}
slove(sa,so);}}
error(sa,so);
}
//checnum******************************************* *********
int checknum (int sa,int so,int num)
{
//CHECK SATR
for (int i=0;i<9;i++){
if(sodoko[sa][i]==num){
return 0;}}
//check soton
for (int j=0;j<9;j++)
if(sodoko[j][so]==num){
return 0;}
//CHECK SQURE
if(sa<3)
sa=0;
else if(sa>=3 && sa<6)
sa=3;
else
sa=6;
if (so<3)
so=0;
else if (so>=3 && so<6)
so=3;
else
so=6;
for (int m=0;m<3;m++){
for (int n=0;n<3;n++){
if(sodoko[sa+m][so+n]==num){
return 0;}}}
return 1;}