#include using namespace std; void inizializza(); void quad_in_righe(int, int***); void istruzioni(int n, int***); int vincoli(int***); void stampa(int n, int***); int main(){ inizializza(); return 0;} void inizializza(){ int n=9; int ***v=new int**[3]; v[0]=v[1]=v[2]=new int*[9]; v[0][0]=v[0][1]=v[0][2]=v[0][3]=v[0][4]=v[0][5]=v[0][6]=v[0][7]=v[0][8]=new int[9]; v[1][0]=v[1][1]=v[1][2]=v[1][3]=v[1][4]=v[1][5]=v[1][6]=v[1][7]=v[1][8]=new int[9]; v[2][0]=v[2][1]=v[2][2]=v[2][3]=v[2][4]=v[2][5]=v[2][6]=v[2][7]=v[2][8]=new int[9]; cout<<"Inserire ordinatamente le righe."<<endl; for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ cout<<"Elemento: "<<i+1<<"-"<<j+1<<" "; cin>>v[0][i][j]; v[2][j][i]=v[0][i][j];}} quad_in_righe(n, v);} void quad_in_righe(int n, int ***v){ //trasformo i quadretti in righe int a=-1, b; for(int i=0; i<n; i+=3){ for(int j=0; j<n; j+=3){ b=-1; a++; for(int k=0; k<3; k++){ for(int l=0; l<3; l++){ v[1][a][b++]=v[0][i+k][j+l];}}}} istruzioni(n, v);} void istruzioni(int n, int ***v){ int c=0, h=0; do{ for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ c=0; for(int u=1; u<10; u++){ v[0][i][j]=u; c+=vincoli(v);} if(c==1){c=0; // for(int u=1; u<10; u++){ // if(c<1){v[0][i][j]=u; // c+=(vincoli(v));}}} // for(int i=0; i<n; i++){ for(int j=0; j<n; j++){ if(v[0][i][j]==0)h++;}}}}} while(h==0); stampa(n, v);} int vincoli(int ***v){ int counter=0, n=9; for(int t=0; t<3; t++){ for(int i=0; i<(n-1); i++){ for(int j=0; j<(n-1); j++){ for(int k=1; k<(n-j); k++){ if(v[t][i][j]!=v[t][i][j+k]) return 1;}}}}} void stampa(int n, int ***v){ for(int i=0; i<n; i++){ cout<<"\n"; for(int j=0; j<n; j++){ cout<<v[0][i][j]; }}}La procedura è:
-crea tre matrici quadrate attraverso un unico puntatore
-la prima contiene il sudoku da risolvere con zeri al posto degli spazi vuoti
-la seconda nelle righe contiene i qudretti 3X3 del sudoku
-la terza contiene la trasposta della prima
-tutto questo per potere controllare le condizioni che i numeri siano fra loro
diversi agendo un unica volta con un ciclo for sulle righe della matrice 3x9x9
-la funzione istruzione prova i numeri da uno a nove passandoli alla funzione
vincoli. Se la soluzione per un quadretto è unica allora essa viene fissata e
si va avanti... solo che non ci siamo
ad esempio non trovo modo di inizializzare v come ad esempio int ***v=new int[3][9][9] senza dovere scrivere quello stupido elenco di inizializzazioni parziali. Poi, bisogna anche impedire che il programma ritorni sui numeri già fissati. Non so se ci siano altri algoritmi ma dato che mi è venuto in mente questo e tutto sommato mi sembra semplice sarei cuorioso di vederlo funzionare, ma non sono abbastanza skillato