#include #include 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; }}