Vai al contenuto


Foto

Programma per risolvere il sudoku


Questa discussione e' stata archiviata Questo significa che non e' possibile rispondere
2 risposte a questa discussione

#1 Aldin

Aldin

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.976 Messaggi:

Inviato 28 agosto 2011 - 07:27

Non mi viene. Qualcuno ha voglia di darci un'occhiata?

#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 :trollface:

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 :trollface:

Attenti al cane

 

dWUkZcX.gif


#2 TigerShark

TigerShark

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 16.685 Messaggi:

Inviato 28 agosto 2011 - 07:43

http://www.hwupgrade...d.php?t=1995326

da notare in parrticolare questo dii gugoxx:

with x( s, ind ) as

( select sud, instr( sud, ' ' )

  from ( select '53  7    6  195    98    6 8   6   34  8 3  17   2   6 6    28    419  5    8  79' sud from dual )

  union all

  select substr( s, 1, ind - 1 ) || z || substr( s, ind + 1 )

       , instr( s, ' ', ind + 1 )

  from x

     , ( select to_char( rownum ) z

         from dual

         connect by rownum <= 9

       ) z

  where ind > 0

  and not exists ( select null

                   from ( select rownum lp

                          from dual

                          connect by rownum <= 9

                        )

                   where z = substr( s, trunc( ( ind - 1 ) / 9 ) * 9 + lp, 1 )

                   or    z = substr( s, mod( ind - 1, 9 ) - 8 + lp * 9, 1 )

                   or    z = substr( s, mod( trunc( ( ind - 1 ) / 3 ), 3 ) * 3

                                      + trunc( ( ind - 1 ) / 27 ) * 27 + lp

                                      + trunc( ( lp - 1 ) / 3 ) * 6

                                   , 1 )

                 )

)

select s

from x

where ind = 0

:trollface: :trollface: :asd:
I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain.

#3 Aldin

Aldin

    Schiavo

  • Membri
  • StellettaStellettaStellettaStellettaStellettaStellettaStelletta
  • 12.976 Messaggi:

Inviato 28 agosto 2011 - 17:54

:patpat:

Attenti al cane

 

dWUkZcX.gif