Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [C++] Vector di vector di oggetti annidati
Forum - C/C++ - [C++] Vector di vector di oggetti annidati

Avatar
gen_ht (Normal User)
Newbie


Messaggi: 2
Iscritto: 19/01/2014

Segnala al moderatore
Postato alle 18:15
Domenica, 19/01/2014
Salve a tutti, premetto che sono alle prime armi con il c++ e con la programmazione a oggetti, per cui probabilmente ciò che voglio chiedervi potrebbe essere banale, anche se ho cercato qua e la in rete degli spunti senza però riuscire a trovare qualcosa che risolva il mio problema.

Arrivando al dunque, sono studente universitario e mi sono imbattuto in un programma che debba essere strutturato in questo modo:

Ho una classe chiamata sudoku, che contiene N*N box. Ogni box contiene N*N celle. Ogni cella ha un valore intero...
Esempio: il sudoku classico è il 3x3, quindi una matrice che contiene 9 "oggetti", ed ognuno di essi contiene 9 valori, compresi da 1 a 9 appunto...

Per fare ciò voglio usare 3 classi: cell, box e sudoku.
Quella più grossa, cioè sudoku, ha un attributo vector di vetor del tipo box, mentre box ha una vector di vector come attributo, del tipo cella..
Il problema è che non riesco a capire come fare per riempire ogni valore di cella all'interno di box !!!
Ho provato in svariate maniere, ma purtroppo la mia inesperienza nel linguaggio mi porta sempre a cancellare tutto il main...

Qui un pò di codice:

CLASSE CELL:
Codice sorgente - presumibilmente C++

  1. #include <vector>
  2. using std::vector;
  3. class cella {
  4.    
  5. private:
  6.     int value;
  7.    
  8. public:
  9.     cella();
  10.     ~cella();
  11.     void set_value(int x);
  12.     int get_value();
  13.    
  14. };



Codice sorgente - presumibilmente C++

  1. #include "cella.h"
  2.  
  3. cella::cella() {
  4. }
  5.  
  6. cella::~cella() {
  7. }
  8.  
  9. void cella::set_value(int x)
  10. {
  11.     this->value = x;
  12. }
  13.  
  14. int cella::get_value()
  15. {
  16.     return this-> value;
  17. }



CLASSE BOX:
Codice sorgente - presumibilmente C++

  1. #include "cella.h"
  2. #include <vector>
  3.  
  4. using std::vector;
  5.  
  6. class box {
  7.    
  8. private:
  9.     vector< vector<cella> > celle;
  10.    
  11. public:
  12.     box();
  13.     ~box();
  14.     vector< vector<cella> >get_celle();
  15.    
  16. };



Codice sorgente - presumibilmente C/C++

  1. #include "box.h"
  2.  
  3. box::box() {
  4.    
  5. }
  6.  
  7. box::~box() {
  8. }
  9.  
  10. vector< vector<cella> > box::get_celle()
  11. {
  12.     return this->celle;
  13. }



CLASSE SUDOKU:
Codice sorgente - presumibilmente C++

  1. #include "box.h"
  2. #include <vector>
  3.  
  4. using std::vector;
  5.  
  6. class sudoku {
  7.    
  8. private:
  9.     vector <vector <box> > boxes;
  10.    
  11. public:
  12.     sudoku();
  13.     ~sudoku();
  14.     vector <vector <box> > get_boxes();
  15.  
  16. };



Codice sorgente - presumibilmente C/C++

  1. #include "sudoku.h"
  2.  
  3. sudoku::sudoku() {
  4. }
  5.  
  6. sudoku::~sudoku() {
  7. }
  8.  
  9. vector <vector <box> > sudoku::get_boxes()
  10. {
  11.     return this->boxes;
  12. }




L'intento sarebbe quello di passare il size N chiesto da tastiera dall'utente, per poi generare e riempire di valori il sudoku (ho pensato di farlo da file in futuro, ma prima devo riuscire ad inserirli a mano..!  ;)

Ho pensato ad un costruttore della classe sudoku, che mi inizializzi il size della vector di vector boxes, però poi non so come continuare, anzi non ne ho idea!

Spero nell'aiuto di qualcuno di voi .. !!

PM Quote
Avatar
carmine (Member)
Pro


Messaggi: 168
Iscritto: 20/04/2010

Segnala al moderatore
Postato alle 20:57
Lunedì, 20/01/2014
Potresti risolvere con una cosa del genere:

Codice sorgente - presumibilmente C/C++

  1. class Box
  2. {
  3.     private:
  4.         vector < vector<Cell> > Cells;
  5.     public:
  6.        
  7. //Passa per riferimento la vector
  8.         vector < vector<Cell> > & GetCells()
  9.         {
  10.             return Cells;  
  11.         }
  12.        
  13.    
  14. };
  15.  
  16. class Sudoku
  17. {
  18.     private:
  19.         vector< vector<Box> > Boxes;
  20.     public:
  21.  
  22. //Resize delle vector
  23.         Sudoku(int n)
  24.         {
  25.             Boxes.resize(n);
  26.             for(int i = 0; i < n; i++)
  27.             {
  28.                 Boxes[i].resize(n);  
  29.                 for(int j = 0; j < n; j++)
  30.                 {
  31.                     Boxes[i][j].GetCells().resize(n);
  32.                     for(int z = 0; z < n; z++)
  33.                     {
  34.                                            Boxes[i][j].GetCells()[z].resize(n);
  35.                     }
  36.                 }
  37.             }
  38.            
  39.  
  40.         }
  41.        
  42.         void AddValue(int i, int j, int z, int k, int value)
  43.         {
  44.               Boxes[i][j].GetCells()[z][k].SetValue(value);
  45.         }
  46.        
  47.         int GetValue(int i, int j, int z, int k)
  48.         {
  49.             return Boxes[i][j].GetCells()[z][k].GetValue();  
  50.         }
  51.        
  52.        
  53.        
  54. };



Fammi sapere se và! ;)


Computer Science
PM Quote
Avatar
gen_ht (Normal User)
Newbie


Messaggi: 2
Iscritto: 19/01/2014

Segnala al moderatore
Postato alle 21:16
Lunedì, 20/01/2014
Ottimo !!!! Finalmente una risposta, e pure soddisfacente !!
Non avrei mai potuto pensare di passare per riferimento la vector della classe Box !

Ho provato con questo main:
Codice sorgente - presumibilmente C/C++

  1. int main()
  2. {
  3.    
  4.     Sudoku sud(3);
  5.     for(int i = 0; i < 3; i++)
  6.     {
  7.         for(int j = 0; j < 3; j++)
  8.         {
  9.             for(int z = 0; z < 3; z++)
  10.             {
  11.                 for(int k = 0; k < 3; k++)
  12.                 {
  13.                     sud.AddValue(i, j, z, k, k);
  14.                 }
  15.             }
  16.         }
  17.     }
  18.    
  19.     for(int i = 0; i < 3; i++)
  20.     {
  21.         cout <<endl;
  22.         for(int j = 0; j < 3; j++)
  23.         {
  24.             cout <<endl;
  25.             for(int z = 0; z < 3; z++)
  26.             {
  27.                 cout <<" ";
  28.                 for(int k = 0; k < 3; k++)
  29.                 {
  30.                     cout << sud.Get(i, j, z, k)<<" ";
  31.                 }
  32.             }
  33.         }
  34.      }
  35.     return 0;
  36. }



E tutto funziona, finalmente.. Persi 3 giorni quasi per cercare di fare una cosa simile, ma senza conclusione!
Ora posso dedicarmi al backtracking per risolvere un "N * N" sudoku !
Grazie ancora, sono in debito :)
:k::k::k:

PM Quote