// code by Salvatore Cerruto // this code allow to solve sudoku with recursive approach /* sudolib.h */ typedef enum{FALSE, TRUE} boolean; FILE *aggancio_file(char nomefile[]); int get_matrix(FILE *file, int ***matrice, char nomefile[]); int genera_soluzione(int **matrice, int N, int riga, int colonna); void stampa_soluzione(int **matrice, int N); int controlla_sudoku(int **matrice, int N, int riga, int colonna); /* sudolib.c */ #include #include #include #include "sudolib.h" FILE *aggancio_file(char nomefile[]) { FILE *file=NULL; file=fopen(nomefile, "r"); return (file); } int get_matrix(FILE *file, int ***matrice, char nomefile[]) { int temp, item=0, riga, colonna; while(fscanf(file, "%d", &temp)!=EOF) item++; fclose(file); file=aggancio_file(nomefile); if(file!=NULL) { /** allocazione righe **/ *matrice=(int **) malloc(sqrt(item)*sizeof(int *)); for(riga=0; riga=N) return 1; /* se la casella è già presente deve saltarla */ if(matrice[riga][colonna]!=0) { if(colonna==N-1) return genera_soluzione(matrice, N, riga+1, 0); else return genera_soluzione(matrice, N, riga, colonna+1); } for(k=1; k<=N; k++) { matrice[riga][colonna]=k; /**system("cls"); stampa_soluzione(matrice, N);**/ if(controlla_sudoku(matrice, N, riga, colonna)) { if(colonna==N-1) { if(genera_soluzione(matrice, N, riga+1, 0)) return 1; } else { if(genera_soluzione(matrice, N, riga, colonna+1)) return 1; } } matrice[riga][colonna]=0; } return 0; } void stampa_soluzione(int **matrice, int N) { int i, j, k, cont_c=0, cont_r=0; printf("+"); for(i=0; i<2*N+sqrt(N)-1; i++) printf("-"); printf("+"); for(i=0; i #include #include "sudolib.h" #define MAX 20 int main() { int **matrice, N; char nomefile[MAX]; FILE *filein; printf("***** Sudoku *****\n"); printf("Inserire il nome del file schema: "); scanf("%s", nomefile); filein=aggancio_file(nomefile); if(filein!=NULL) { N=get_matrix(filein, &matrice, nomefile); if(genera_soluzione(matrice, N, 0, 0)) { printf("\n***** Soluzione *****\n"); stampa_soluzione(matrice, N); } else printf("\nSoluzione impossibile"); } return 0; } /* example file */ 6 0 0 0 0 0 4 3 0 0 0 0 0 7 0 5 1 0 0 0 0 3 0 4 0 0 9 0 0 3 0 0 8 9 0 0 0 2 0 0 0 0 0 8 0 0 0 8 5 0 0 2 0 0 2 0 0 4 0 7 0 0 0 0 1 4 0 6 0 0 0 0 0 6 9 0 0 0 0 0 7