The Dark Side of Hardware Upgrade Forum

...bringing out the worst in you since 2003...
Oggi è mar ott 06, 2026 1:56 am

Tutti gli orari sono UTC +1 ora


-->
-->

Apri un nuovo argomento Rispondi all’argomento  [ 3 messaggi ] 
Autore Messaggio
 Oggetto del messaggio: Programma per risolvere il sudoku
MessaggioInviato: dom ago 28, 2011 7:27 am 
Schiavo
Avatar utente
Iscritto il: gio lug 15, 2010 7:35 pm
Messaggi: 5339
Località: Tua madre succhia i cazzi all'inferno, idiota
Non mi viene. Qualcuno ha voglia di darci un'occhiata?

Codice:
#include<iostream>
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 :asd:

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 :mcoso:
_________________
Long Live Iran
Immagine
Top
 Profilo E-mail Non connesso  
 
 Oggetto del messaggio: Re: Programma per risolvere il sudoku
MessaggioInviato: dom ago 28, 2011 7:43 am 
Schiavo
Avatar utente
Iscritto il: ven feb 03, 2006 10:50 pm
Messaggi: 5164
Località: Reggio Calabria --> London
http://www.hwupgrade.it/forum/showthread.php?t=1995326

da notare in parrticolare questo dii gugoxx:
Codice:
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

:asd: :asd: :asd:
_________________
:scongiuri:
Top
 Profilo Non connesso  
 
 Oggetto del messaggio: Re: Programma per risolvere il sudoku
MessaggioInviato: dom ago 28, 2011 5:54 pm 
Schiavo
Avatar utente
Iscritto il: gio lug 15, 2010 7:35 pm
Messaggi: 5339
Località: Tua madre succhia i cazzi all'inferno, idiota
:v
_________________
Long Live Iran
Immagine
Top
 Profilo E-mail Non connesso  
 
Visualizza ultimi messaggi:  Ordina per  
Apri un nuovo argomento Rispondi all’argomento  [ 3 messaggi ] 
-->

Tutti gli orari sono UTC +1 ora


Chi c’è in linea

Visitano il forum: Nessuno e 0 ospiti


Non puoi aprire nuovi argomenti
Non puoi rispondere negli argomenti
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi inviare allegati

Vai a:  
cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Traduzione Italiana phpBB.it