/* * Restituisce due numeri casuali diversi */ int *randomd(){ int *r = (int *)malloc(2 * sizeof(int)); do{ r[0] = randomr(1,9); r[1] = randomr(1,9); }while(r[0] == r[1]); return r; }
/* * Restituisce un numero casuale nell'intervallo [min, max) */ int randomr(int min, int max){ int base = rand(); int intervallo = max - min; if (RAND_MAX == base) return randomr(min, max); if (base < RAND_MAX - (RAND_MAX % intervallo)) return min + base / (RAND_MAX / intervallo); else return randomr(min, max); }
unsigned long randomul_lim (unsigned long min ,unsigned long max) { real f = randomr(); return f * ( max - min + 1 ) + min; }
/* * Inizializza la tabella del sudoku * generando uno schema */ void inizializza(int spazi){ int base[n][n] = {\ {6,9,7,1,4,3,8,2,5},\ {4,1,8,9,2,5,6,3,7},\ {2,5,3,8,7,6,4,9,1},\ {7,3,2,4,6,8,5,1,9},\ {8,4,9,3,5,1,7,6,2},\ {5,6,1,2,9,7,3,8,4},\ {3,8,4,7,1,9,2,5,6},\ {1,2,6,5,3,4,9,7,8},\ {9,7,5,6,8,2,1,4,3}\ }; int sostituzioni[9]; /* genera uno schema * facendo delle sostituzione * in uno di partenza. */ for(int l=0; l<25; l++){ int *r; //scambia riga r = randomd(); for(int i=0; i<n; i++){ for(int k=0; k<n; k++) sostituzioni[k] = base[i][k]; for(int s=0; s<9; s++) if (sostituzioni[s] == r[0]) sostituzioni[s] = r[1]; else if (sostituzioni[s] == r[1]) sostituzioni[s] = r[0]; for(int p=0; p<9; p++) for(int q=0; q<9; q++) base[i][q] = sostituzioni[q]; } //scambia colonna r = randomd(); for(int i=0; i<n; i++){ for(int k=0; k<n; k++) sostituzioni[k] = base[i][k]; for(int s=0; s<9; s++) if (sostituzioni[s] == r[0]) sostituzioni[s] = r[1]; else if (sostituzioni[s] == r[1]) sostituzioni[s] = r[0]; for(int p=0; p<9; p++) for(int q=0; q<9; q++) base[q][i] = sostituzioni[q]; } } for(int l=0; l<25; l++){ int r = randomr(0,3); switch(r){ //colonna centrale fissa case 0:{ for(int i=0; i<9; i++){ for(int k=0; k<9; k++) sostituzioni[k] = base[i][k]; for(int j=0; j<9; j++) if(j != 4) base[i][j] = sostituzioni[8-j] ; } break; } //riga centrale fissa case 1:{ for(int k=0; k<9; k++){ for(int i=0; i<9; i++) sostituzioni[i] = base[i][k]; for(int j=0; j<9; j++) if(j!=4) base[j][k] = sostituzioni[8-j]; } break; } //inversione riga 3-5 case 2:{ for(int i=0; i<9; i++) scambia(&base[3][i], &base[5][i]); break; } } } //inserisci gli spazi for(int i=0; i<spazi; i++){ int unico = 0; //la casella è valida do{ int x = randomr(0,9); int y = randomr(0,9); if(!base[x][x]) unico = 1; else { base[x][y] = 0; unico = 0; } }while(unico == 1); } //copia lo schema generato nella matrice for(int i=0; i<n; i++) for(int k=0; k<n; k++){ sudoku[i][k][0] = base[i][k]; if(!base[i][k]) sudoku[i][k][1] = 1; } }