#include <stdio.h>
#include <stdlib.h>
int completed(int array[9][9]);
int numberInRow(int array[9][9], int a, int val);
int numberInCol(int array[9][9], int a, int val);
int numberIn3x3(int array[9][9], int a, int b, int val);
void cheat(int array[9][9] , int di , int dj);
void help(int array[9][9], int di, int dj);
void solve(int array[9][9]);
int EisagogiArithmou(int array[9][9], int di, int dj);
main()
{
int intch,intch1, i, j,i1,j1,x ,y, z;
char ch,ch1, arraych[2], arraych1[2];
FILE *fp,*fp1;
char epilogi = 0;
int array[9][9];
int arraysolve[9][9];
while (epilogi != '3'){
epilogi = '0';
if(epilogi=='0'){
printf(" 1.Play Sudoku\n 2.Solve Sudoku\n 3.Exit\n============================================\n");
epilogi = getchar();
}
if (epilogi == '1')
{
if((fp = fopen("pinakas.txt", "r")) == NULL) {
printf(" Cannot open file.\n");
exit(1);}
j = 0;
i = 0;
while ((ch = fgetc(fp)) !=EOF) {
arraych[0] = ch;
arraych[1]= '\0';
intch = atoi(arraych);
array[i][j] = intch;
j++;
if (j==9) {
i++;
j = 0;}};
fclose(fp);
for (i=0 ; i<=8 ; i++)
{for (j=0 ; j<=8 ; j++)
printf("%d ",array[i][j]);
printf("\n");}
int zeroplaces[82];
int pntr = 1;
for (i=0; i<9; i++) {
for (j = 0; j<9; j++) {
if (array[i][j] ==0) {
zeroplaces[pntr] = i * 10 + j;
pntr++;}}}
int rightinput = 0;
int bigwhile =0;
while (bigwhile==0)
{
while (rightinput == 0)
{
printf("Doste sintategmenes morfis x,y=z Prepei na ixuei: -1<=(x,y)<=8 kai 0<=z<=9\n");
scanf("%d,%d=%d",&x,&y,&z);
if (x==-1 && y==-1 && z==-1) {bigwhile=1;rightinput=1;}
if (x!=-1 || y!=-1) {
if (x <= 8 && x>=-1 && y<= 8 && y>=-1 && z>=-1 && z<=10){
if (memo(zeroplaces,x,y,pntr)==0 && sper(array,x,y,z)==0)
rightinput = 1;
}
}
}
/* kataxorisi arithmon ston array */
if (x!=-1 || y!=-1) {
if (x!=-1 && y!=-1 && z!=10 && z!=-1) {
array[x][y]=z;
for (i=0; i<9;i++) {
for (j=0; j<9;j++){
printf("%d ", array[i][j]);
}
printf("\n");
}};
if (x!=-1 && y!=-1 && z==-1)
help(array,x,y);
if (x!=-1 && y!=-1 && z==10){
cheat(array,x,y);}
rightinput=0;
}
}
}
if(epilogi=='2')
solve(array);
}
return 0;}
int completed(int array[9][9])
{
int a=1, i, j;
for (i=0 ; i<=8 ; i++) {
for (j=0 ; j<=8; j++)
if (array[i][j] == 0)
a = 0;
};
return a;}
int numberIn3x3(int array[9][9], int a, int b, int val)
{
int i, j, logvar = 0;
for (i = (a/3)*3; i<= (a/3)*3+2; i++) {
for (j = (b/3)*3; j <= (b/3)*3+2; j++)
if (array[i][j] == val) logvar = 1;};
return logvar;}
int numberInRow(int array[9][9], int a, int val)
{
int b, logrow = 0;
for (b = 0; b < 9; b++) {
if (array[a][b] == val) logrow = 1;}
return logrow;
}
int numberInCol(int array[9][9], int a, int val)
{
int b, logcol = 0;
for (b = 0; b < 9; b++) {
if (array[b][a] == val) logcol = 1;}
return logcol;
}
int validnumber(int a)
{
if (a<1 || a>9) return 0 ; return 1;
}
int emptyCell(int array[9][9], int a, int b)
{
if ( array[a][b] == 0 ) return 0 ; return 1;
}
void help(int array[9][9], int di, int dj)
{
int i;
if (array[di][dj] == 0) {
printf("Ta diathesima noumera einai:");
for (i=1 ; i<=9; i++) {
if (numberInRow(array,di,i) == 0 && numberInCol(array,dj,i) == 0 && numberIn3x3(array,di,dj,i) == 0)
printf("%d ", i);}
};
printf("\n");
}
void cheat(int array[9][9] , int di , int dj)
{
FILE *fp1;
char ch1 , arraych1[2];
int j1,i1,intch1, arraysolve[9][9];
if((fp1 = fopen("lisi.txt", "r")) == NULL) {
printf(" Cannot open file.\n");
exit(1);}
j1 = 0;
i1 = 0;
while ((ch1 = fgetc(fp1)) !=EOF) {
arraych1[0] = ch1;
arraych1[1]= '\0';
intch1 = atoi(arraych1);
arraysolve[i1][j1] = intch1;
j1++;
if (j1==9) {
i1++;
j1 = 0;}};
fclose(fp1);
printf("%d\n" , arraysolve[di][dj]);
}
/* sinartisi pou elegxei an arxika eixe arithmo h oxi o pinakas */
int memo(int zeroplaces[81], int di, int dj, int count)
{
int u, give = 1;
for (u = 1; u <= (count -1); u++) {
if (zeroplaces[u]/10 == di && zeroplaces[u]%10 ==dj) give = 0;};
if (give ==1)
printf("To tetragono pou epileksate einai katilimeno apo tin arxi kai dn ginetai na allaksi\n");
return give;}
/* sinartisi pou elegxei an o arithmos einai dektos apo tous kanones tou sudoku */
int sper(int array[9][9], int di, int dj, int dz)
{
int give = 1;
if ( numberInRow(array,di,dz)==0 && numberInCol(array,dj,dz)==0 && numberIn3x3(array,di,dj,dz)==0)
give = 0;
if (dz==0)
give=0;
if (give==1) printf("O arithmos pou epileksate den einai dektos apo tous kanones tou sudoku\n");
return give;
}
void solve(int array[9][9])
{
int i,j,o;
for(i=0;i<=8;i++) {
for(j=0;j<=8;j++) {
if(EisagogiArithmou(array,i,j) ==1) {
j=9;
i=0;}
}
}
}
int EisagogiArithmou(int array[9][9], int di, int dj)
{
int a,b,i,j,x,y,z,counter=0;
if (array[di][dj] == 0) {
for (i=0 ; i<=9; i++) {
if (numberInRow(array,di,i) == 0 && numberInCol(array,dj,i) == 0 && numberIn3x3(array,di,dj,i) == 0){
x=i;
y=j;
z= array[x][y];
counter++;}
}
if(counter ==1){
array[x][y] = z;
for (a=0 ; a<=8 ; a++){
for (b=0 ; b<=8 ; b++)
printf("%d ",array[a][b]);
printf("\n");}
return 1;}
if(counter!=1) return 0;
}}