Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128

    [C]-Sudoku e backtracking

    Salve a ragazzi!! è da qualche giorno che sbatto la testa per capire come creare un'algoritmo che mi crei e mi risolva un sudoku!! mi sembra che bisogna usare la tecnica del backtracking, ma nel momento in cui devo verificare che un numero non si trovi nel "box" 3x3 entro cui si trova, entro in crisi... non trovo invece particolari problemi per il controllo su riga e colonna..
    qualche suggerimento?

  2. #2
    Utente di HTML.it L'avatar di ZannaZ
    Registrato dal
    May 2006
    Messaggi
    82

    Re: [C]-Sudoku e backtracking

    Originariamente inviato da Luca_89
    ma nel momento in cui devo verificare che un numero non si trovi nel "box" 3x3 entro cui si trova, entro in crisi... non trovo invece particolari problemi per il controllo su riga e colonna..
    qualche suggerimento?
    Mi vengono in mente due soluzioni: o scandisci ciascun box 3x3 con due cicli for annidati, orizzontalmente dall'offset 0 a 2, e verticalmente (sempre da 0 a 2), che mi sembra il metodo più semplice, oppure l'altra soluzione, beh, è più complicata, quindi al massimo ti posterò il codice se questa non ti aggrada

  3. #3
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Prima di continuare nel controllo... volevo provare ad inserire 26 numeri in posizioni casuali nel sudoku!!per ora nn mi importa il controllo.. mi trovo uno "strano" problema.. voglio che i numeri siano compresi tra 0 e 9 ... funziona.. ma mi inserisce sempre un numero sballato!! Vi posto codice e visualizzazione
    (dopo aver dichiarato srand(time(NULL))
    codice:
                     
    for(c=0; c<26; c++)   {
                              
    i = rand() % 10;  
    j = rand() % 10;
    numero=rand() % 9;
    numero++;
    tavola[i][j]=numero;
                                   }
                                           
    for(i=0; i<9; i++) {
    printf("\n\n");
    for (j=0; j<9; j++)
    printf("%4d", tavola[i][j]);
                                   }
    Che come output mi da :

    codice:
         
    5   0   4   0   7   0   0   0   9     
    9   0   0   4   0   0   0   0   0     
    0   0   0   0   0   0   9   0   2     
    2   0   4   0   0   0   0   0   7     
    7   1   6   2   0   0   0   0   0     
    0   0   0   0   0   0   0   7   5     
    5   2   0   0   3   3   0   0   0     
    0   0   0   0   0   0   0   4   7     
    7   0   9   0  26   0   0   0   0
    Qualsiasi generazione io faccia, in quella posizione mi appare sempre 26.. per quale assurdo motivo??

  4. #4

  5. #5
    Utente di HTML.it L'avatar di ZannaZ
    Registrato dal
    May 2006
    Messaggi
    82
    Comunque non mi ero accorto che volessi anche generare un sudoku: trovare una combinazione che abbia una e una sola soluzione non è affatto un problema semplice, bisogna conoscere un po' di teoria dei grafi...
    Insomma, io partirei dalla risoluzione di un sudoku già generato.

  6. #6
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Allora mi sa che partirò da sudok(i) preimpostati!! ormai la curiosità mi mangia.. perchè mi appare quel 26 che non c'entra niente

  7. #7
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Originariamente inviato da MacApp
    bisognerebbe vedere il resto del codice.
    Il resto del codice mi visualizza un menù.. niente di più

  8. #8
    Utente di HTML.it L'avatar di Stoicenko
    Registrato dal
    Feb 2004
    Messaggi
    2,254
    1) la matrice la inizializzerai no? fai vedere come

    2) perche la i e la j le inizializzi con un rand % 10 (nel mettere i numeri random) qunado vanno da 0 a 8 (compresi visto che è una tabella 9x9)?

  9. #9
    Originariamente inviato da Luca_89
    Il resto del codice mi visualizza un menù.. niente di più
    Ipotizzando che sia come tu dici, allora il tuo programma non e' compilabile.

  10. #10
    Utente di HTML.it L'avatar di Luca_89
    Registrato dal
    Sep 2005
    Messaggi
    128
    Giusto.. %9 non %10 !!
    Questo è il codice intero
    codice:
    #include <stdio.h>
    #include <time.h>
    
    #define MENU 0
    #define OUT 130
    #define CREA 1
    #define GIOCA 2
    
    int menuSud(void);
    int creaSud(void);
    int playSud(void);
    int testSud(void);
    int numero; /* NUMERI DA INSERIRE NELLE CELLE */
    int tavola[8][8]; /* CELLE TAVOLA */
    int i, j; /* RIGHE E COLONNE TAVOLA */
    int c; /* CONTATORE INSERIMENTO NUMERI NELLA TAVOLA */
    main() {
        srand(time(NULL)); //inizializza il generatore       
           
           int scelta=MENU;
           while (scelta!=OUT){
                 switch(scelta) {
                     case MENU:
                          scelta=menuSud();
                          if (scelta==MENU)
                          scelta=OUT;
                     break;
                     case CREA:
                          creaSud();
                          scelta=MENU;
                          break;
                     case GIOCA:
                          playSud();     
                          scelta=MENU;
                          break;
                                }
                               }
                              
     
            }           
    
          /* MENU */
           int menuSud(void)
            {
            int scelta;
            char invio;
            int vero=1;
                while (vero) {
                      printf("\n\n\n\n");
                      printf("\t\t\t Sudoku");
                      printf("\n\n\n\t\t\t 1. Crea un nuovo Sudoku");
                      printf("\n\n\t\t\t 2. Gioca");
                      printf("\n\n\n\t\t\t 0. Esci");
                      printf("\n\n\n\t\t\t\t Scegliere un'opzione: ");
                      scanf("%d", &scelta);
                      scanf("%c", &invio);
                      switch (scelta){
                             case 1:
                             case 2:
                             case 0:
                                  return(scelta);
                             default:
                                  break;     
                                     }
                      
                             }
                             return(0);
                             }          
                             
              int creaSud(void){
                  
                     for(i=0; i<9; i++) {/* INIZIALIZZO A 0 TUTTE LE CELLE */
                              for (j=0; j<9; j++) tavola[i][j]=0;
                                        }/* FINE INIZIALIZZAZIONE A 0 */             
                  
                     for(c=0; c<26; c++)   {/* INSERIMENTO NUMERI  */
                              
                              i = rand() % 9;  
                              j = rand() % 9;
                              numero=rand() % 9;
                              numero++;
                              tavola[i][j]=numero;
                                           }/* FINE INSERIMENTO NUMERI  */     
                                           
                     for(i=0; i<9; i++) {
                              printf("\n\n");
                              for (j=0; j<9; j++)
                                  printf("%4d", tavola[i][j]);
                                         }
                     
                     
                                         
                               }
              int playSud(void){}
    Ovviamente ci sono delle funzioni non definiteche appena risolto il problema definirò

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.