[C++]Riempimento matrice 2
Ho un esercizio simile a quello che ho postato qualche giorno fa,che riguarda il riempimento di una matrice fatta con un vector di vector(che...ok,non è la soluzione più adatta).
Questa volta l'esercizio consiste nel riempire un numero di celle adiacenti scelto dall'utente,dove la cella iniziale e la direzione sono casuali.Sono accettati riempimenti sovrapposti o parziali(non importa se una cella è già stata riempita,così come non importa cambiare direzione una volta toccato un bordo...si riempiono tante caselle finchè appunto si toccano i bordi della matrice).
Questo è il mio codice:
Ovviamente vi chiedo di aiutarmi perchè non riesco a capire dove sbaglio
Questa volta l'esercizio consiste nel riempire un numero di celle adiacenti scelto dall'utente,dove la cella iniziale e la direzione sono casuali.Sono accettati riempimenti sovrapposti o parziali(non importa se una cella è già stata riempita,così come non importa cambiare direzione una volta toccato un bordo...si riempiono tante caselle finchè appunto si toccano i bordi della matrice).
Questo è il mio codice:
#include <iostream> #include <vector> #include <cstdlib> #include <ctime> #include <cmath> #include <fstream> using namespace std; int main(int argc, char *argv[]) { //Allocazione matrice int rows,cols; cout<<"Dimensioni della matrice:\n"; cin>>rows >>cols; vector< vector<char> > matrix(rows, vector<char>(cols, '-')); srand(time(NULL)); int size; cout<<"Celle da riempire="; cin>>size; while(size!=0) { //cella di partenza casuale: int Y=rand()%rows +1; int X=rand()%cols +1; int dx=0,dy=0; char verso; cout<<"Verticale[V] o orizzontale[O] ? "; cin>>verso; if(verso=='v' || verso=='V') { dy = pow(-1,rand()%2); //-1 o +1 } else if(verso=='o' || verso=='O') dx = pow(-1,rand()%2); //-1 o +1 int riempite=0; //contatore per "size" for (int y = Y; y>=0 && y<=rows; ) { for (int x = X; x>=0 && x<=cols && riempite<=size;riempite++) { matrix[y][x]='+'; y += dy; x += dx; } } print(matrix); //funzione definita altrove cout<<"Celle da riempire="; cin>>size; } return 0; }
Ovviamente vi chiedo di aiutarmi perchè non riesco a capire dove sbaglio
Risposte
Non hai detto cos'è che non funziona.
Intanto noto un paio di cose:
Non dovrebbe esserci + 1, altrimenti il risultato potrebbe essere fuori dalla matrice. rand() % rows restituisce un valore in [0, rows), cioè [0, rows-1], che sono esattamente gli indici possibili.
Controlla che a dx e dy venga effettivamente assegnato 1 o -1 (stampandone i valori).
Anche il doppio ciclo è sbagliato. Innanzitutto c'è la possibilità che non termini mai: se scrivi in orizzontale, una volta uscita dal ciclo interno non esci da quello esterno.
Dovrebbe bastare un ciclo unico:
Quando una delle condizioni diventa falsa (cioè hai sbattuto contro un bordo qualsiasi o hai riempito "size" caselle) ti fermi. Indipendentemente dalla direzione in cui stavi andando.
Infine, se inizializzi il generatore di numeri casuali con time(0) ad ogni esecuzione il risultato sarà diverso. Magari inizializzalo con un valore costante (es. 5) in modo che se ti accorgi di un errore puoi riprodurlo.
Intanto noto un paio di cose:
int Y=rand()%rows +1; int X=rand()%cols +1;
Non dovrebbe esserci + 1, altrimenti il risultato potrebbe essere fuori dalla matrice. rand() % rows restituisce un valore in [0, rows), cioè [0, rows-1], che sono esattamente gli indici possibili.
dy = pow(-1,rand()%2); //-1 o +1
Controlla che a dx e dy venga effettivamente assegnato 1 o -1 (stampandone i valori).
Anche il doppio ciclo è sbagliato. Innanzitutto c'è la possibilità che non termini mai: se scrivi in orizzontale, una volta uscita dal ciclo interno non esci da quello esterno.
Dovrebbe bastare un ciclo unico:
for (int y = Y, x = X, riempite = 0; x >= 0 && x <= cols && y >= 0 && y <= rows && riempite < size; x += dx, y += dy, riempite += 1) { matrix[y][x]='+'; }
Quando una delle condizioni diventa falsa (cioè hai sbattuto contro un bordo qualsiasi o hai riempito "size" caselle) ti fermi. Indipendentemente dalla direzione in cui stavi andando.
Infine, se inizializzi il generatore di numeri casuali con time(0) ad ogni esecuzione il risultato sarà diverso. Magari inizializzalo con un valore costante (es. 5) in modo che se ti accorgi di un errore puoi riprodurlo.