buonasera,
ho un problema con un programma che non restituisce un output corretto, anche se gira.
in pratica devo realizzare un "s u d o k u" particolare, nel senso che puo avere anche una matrice 2x2 3x3 ed anche piu' grande della classica 9x9.
Io sono riuscito a creare la matrice generica con una classe Tabella, che contiene un vector di vector-puntatori di oggetti puntatori "Casella", che rappresentano le caselle del gioco con i seguenti attributi.
-numero (valore che si puo dare alla casella)
-indice di riga
-indice di colonna
-fisso (booleano, true se è un numero fisso cioè una delle caselle iniziali del gioco, false se è vuoto)
in questo modo riesco a generare una matrice di numeri 0 se la casella e vuota, o con un numero random da 1 fino ad arrivare alla grandezza del size. poi visualizzo la matrice vector di vector.
IL PROBLEMA E' QUESTO: Nel mio gioco un numero non si puo ripetere sulla stessa riga, nè sulla stessa colonna. MA A ME COMPAIONO ANCORA VALORI RIPETUTI!!!!
Non so da che dipende, nel costruttore di Tabella cerco di dare dei valori random per generare gli indici e il valore delle Caselle Fisse (Quelle iniziali presenti nel gioco come aiuto), poi applico un metodo booleano
controllaVincoli(Casella * casellaDaControllare), che fino ad ora dovrebbe controllare solo i vincoli per i quali i numeri su stessa riga e colonna non si possono ripete. Il metodo dovrebbe restituire true se fra la casella generata e quella, ma non funziona bene, è come se non riconoscesse tutti i numeri ripetuti generati.
Posto solo parte del codice, quella che non funziona.
STO IMPAZZENDO su questa imperfezione, VI PREGO AIUTATEMI, GRAZIE!!!!
codice:class Tabella { private: int sizeTabella; int sizeRegione; int livelloDifficolta; std::vector<std::vector<Casella*>*> *tabella = new std::vector<std::vector<Casella*>*>(); public: Tabella(int sizeRegione, int livello); /*Crea Tabella di Default a 0*/ ~Tabella(); bool controllaVincoli(Casella* casellaDaControllare); .... .... .... }; .... .... .... .... .... .... /*Crea Tabella di Inizio */ Tabella::Tabella(int sizeRegione, int livelloDifficolta) { this->livelloDifficolta = livelloDifficolta; this->sizeRegione = sizeRegione; this->sizeTabella = sizeRegione*sizeRegione; int quantitaNumeriFissi = this->sizeTabella*this->sizeTabella; //inizializiamo la quantità di fissi alla quantità di numeri in totale in tabella //per calcolare su di essa in seguito la percentuale di numeri fissi tramite lo //costrutto Switch - Case switch (this->livelloDifficolta) { case 3: quantitaNumeriFissi = (int)floor((quantitaNumeriFissi * 5) / 100); break; case 2: quantitaNumeriFissi = (int)floor((quantitaNumeriFissi * 25) / 100); break; case 1: quantitaNumeriFissi = (int)floor((quantitaNumeriFissi * 50) / 100); break; } /**** INIZIO CREAZIONE STRUTTURA MATRICIALE ****/ //Creo un vector di puntatori vector di puntatori Caselle di Default (valore=0). //Simulo così una matrice di 0 for (int i = 0; i < this->sizeTabella; i++) { std::vector<Casella*> *vec = new std::vector<Casella*>; this->tabella->push_back(vec); for (int j = 0; j < this->sizeTabella; j++) { Casella *casella = new Casella(i,j); //Il Costruttore di Default di Casella, genera numero=0 e fisso=false tabella->at(i)->push_back(casella); //sull'i-esimo vettore di vettore inseriamo in coda una Casella di valore 0 //std::cout << "inserita casella " << casella->getRiga() <<" "<<casella->getColonna()<< std::endl; } } /**** INIZIO INSERIMENTO NUMERI FISSI IN TABELLA ****/ int riga = 0; int colonna = 0; int valore = 0; srand((unsigned)time(NULL)); for (int i = 0; i < quantitaNumeriFissi; i++) { riga = (rand() % (this->sizeTabella)); colonna = (rand() % (this->sizeTabella)); valore = (rand() % (this->sizeTabella)) + 1; std::cout << "rand 1 =" << valore << std::endl; Casella *casella = new Casella(valore,riga, colonna); if (this->tabella->at(riga)->at(colonna)->getNumero() == 0 && this->controllaVincoli(casella) == true) //se quel valore è gia presente in riga, colonna o regione { valore = (rand() % (this->sizeTabella)) + 1; //calcola un valore diverso std::cout << "rand 2 =" << valore<<std::endl; } this->tabella->at(riga)->at(colonna)->setNumero(valore); this->tabella->at(riga)->at(colonna)->setFisso(true); } /************FINE INSERIMENTO NUMERI FISSI ******************/ }; . . . . . bool Tabella::controllaVincoli(Casella* casellaDaControllare) { bool esistenza=false; //CONTROLLO PRIMO VINCOLO - ESISTENZA SU STESSA RIGA int ii = casellaDaControllare->getRiga(); int jj = 0; while (jj <this->sizeTabella && this->tabella->at(ii)->at(jj)->getNumero()!=casellaDaControllare->getNumero()) jj++; if (jj == this->sizeTabella) esistenza = false; else esistenza = true; //CONTROLLO SECONDO VINCOLO - ESISTENZA SU STESSA COLONNA ii = 0; jj = casellaDaControllare->getColonna(); while (ii <this->sizeTabella && this->tabella->at(ii)->at(jj)->getNumero() != casellaDaControllare->getNumero()) ii++; if (ii == this->sizeTabella) esistenza = esistenza && false; else esistenza = esistenza && true; std::cout << "esistenza = " << esistenza << std::endl; return esistenza; }; /*** FINE CONTROLLO VINCOLI ***/
codice:class Casella { private: int numero; int riga; int colonna; bool fisso; //Se è Numero Fisso = TRUE, se Numero Non Fisso = FALSE public: Casella(int riga, int colonna); Casella(int numero, int riga, int colonna); Casella(int numero, int riga, int colonna, bool fisso); ~Casella(); void setNumero(int numero){ this->numero = numero; }; void setRiga(bool fisso){ this->fisso = fisso; }; void setColonna(int colonna){ this->colonna = colonna; }; void setFisso(bool fisso){ this->fisso = fisso; }; int getNumero(){ return this->numero; }; int getRiga(){ return this->riga; }; int getColonna(){ return this->colonna; }; bool getFisso(){ return this->fisso; }; };

Rispondi quotando