Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
ho scritto il codice per risolvere il sudoku (inizialmente ho fissato una configurazione, successivamente farò una funzione per immetterne altre)i l problema è che compila ma non funziona e non riesco a capire perchè.
ho riscritto il codice delle funzioni poi dando come argomento la matrice perchè credo che il problema sia quello e ho inserito la visualizzazione all'interno della funzione solve ma il risultato finale è uguale.
ora posto il primo codice, aiutatemi a capire cosa non va
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdbool.h>
#define N 9
int m[N][N]={0,0,0,0,0,0,0,0,0, 0,8,3,5,0,0,4,1,0, 0,7,0,6,0,0,0,2,0, 0,0,0,0,8,0,1,6,0, 0,0,0,2,0,6,0,0,0, 0,1,7,0,4,0,0,0,0, 0,5,0,0,0,9,0,4,0, 0,4,2,0,0,1,7,3,0, 0,0,0,0,0,0,0,0,0};
// visualizza griglia sudoku
void visualizza()
{
for(int i=0; i<N; i++){
for(int j=0; j<N; j++)
printf("%3d",m[i][j]);
printf("\n");
}
printf("\n");
return;
}
//restituisce true se la configuarazione della griglia è valida
bool config_valida ()
{
//ELEMENTI RIGA DIFFERENTI: m[i,h] != m[i,k] per ogni h!=k
for(int i=0; i<N ; i++)
for(int h=0; h<N; h++)
for(int k=0; k<N ; k++)
if( h!=k){
if( m[i][h]== m[i][k])
returnfalse;//se cè un conflitto la funzione ritorna falso
}
//ELEMENTI COLONNA DIFFERENTI m[h,j] != m[k][j] per ogni h!=k
for(int j=0; j<N ; j++)
for(int h=0; h<N ; h++)
for(int k=0; k<N ; k++)
if( h!=k ){
if( m[h][j]== m[k][j])
returnfalse;
}
//ELEMENTI PER QUADRANTE DIFFERENTI m[i,j] != m[h,k] per ogni i,j <9 e h=i/3 +1..h/3+2...h/3+3
for(int i=0; i<N ; i++)
for(int j=0; j<N ; j++)
for(int s=1; s<4 ; s++)
for(int t=1; t<1 ; t++){
int h=i/3+s;
int k=j/3+t;
if( m[i][j]== m[h][k])
returnfalse;
}
returntrue;
}
//restituisce vero se ha risolto il sudoku
bool solve()
{
bool done =false;
int i =-1;int j=-1;
//cerca i e j indici minimi tali che m[i,j]=0
for(int k=0; k<N; k++){
for(int t=0; t<N; t++)
if(!m[k][t])
{ i=k; j=t;break;}
if(i!=-1 && j!=-1)break;
}
//se è stata trovata una cella vuota inserisci un valore e richiama funzione se la config è valida
if(i!=-1 && j!=-1){
for(int k=0; k<N; k++){
m[i][j]= k;
if( config_valida()&& solve())//se inserendo il numero la configurazione e valida e si possono fare ulteriori inserimenti
done =true;//passo finale dell'iterazione
}
if(!done ) m[i][j]=0;//se l'inserimento fatto è valido ma non porta alla soluzione riporta la cella a 0
grazie mille...hai realizzato davvero un codice molto semplice da leggere nonostante io non conosca il c++.
ho modificato il mio codice ispirandomi anche al tuo per la funzione solve e rendendo più modulare la funzione configurazione ma il programma non funziona ancora per la mia istanza....aiutami a capire cosa non va
Codice sorgente - presumibilmente C++
#include <stdio.h>
#include <stdbool.h>
int m[9][9]={{4,0,0,0,0,0,0,0,0}, {0,8,3,5,0,0,4,1,0}, {0,7,0,6,0,0,0,2,0} ,{0,0,0,0,8,0,1,6,0}, {0,0,0,2,0,6,0,0,0} ,{0,1,7,0,4,0,0,0,0}, {0,5,0,0,0,9,0,4,0} ,{0,4,2,0,0,1,7,3,0} ,{0,0,0,0,0,0,0,0,0}};
// visualizza griglia sudoku
void visualizza(void)
{
for(int i=0; i<N; i++){
for(int j=0; j<N; j++)
printf("%3d",m[i][j]);
printf("\n");
}
printf("\n");
return;
}
//restituisce true se la configuarazione della griglia è valida
bool presente_riga(int x, int riga)
{
for(int i=0; i<9; i++){
if( m[riga][i]== x)
returntrue;
}
returnfalse;
}
bool presente_colonna (int x, int colonna )
{
for(int i=0; i<9; i++){
if( m[i][colonna]==x )
returntrue;
}
returnfalse;
}
bool presente_quadrante (int x, int riga, int colonna )
il problema è che il programma termina ma restituisce nessuna soluzione.
secondo te è un problem ail fatto che abbia dichiarato la matrice come variabile globale???