Questa è la mia versione, non ricorsiva.
Ho usato un int al posto dell'enum perchè mi dava strani errori... ma non è per niente difficile sostituirlo.
codice:#include <iostream> #include <cstdlib> using namespace std; void fill_matrix(int*, int); void disp_matrix(int*, int); struct point { int x,y; // costruttore per inizializzare point() {x=0; y=0;} }; int main() { int n; cout << "Larghezza = altezza = ? "; cin >> n; int *matrice = new int[n*n]; fill_matrix(matrice, n); disp_matrix(matrice, n); system("pause"); return 0; } void fill_matrix(int *mtx, int n) { // x e y correnti point a; int tot_line_len = n; int mancano = tot_line_len; // 0=destra // 1=giù // 2=sinistra // 3=su int direz = 0; int i; for(i=1; i<=n*n; i++) { // Scrivo il numero nella posizione corrente mtx[a.y*n + a.x] = i; // La lunghezza che mi manca diminuisce mancano--; // Se sono al limite cambio direzione if(mancano==0) { direz = (direz+1) % 4; if(direz % 2) mancano = --tot_line_len; else mancano = tot_line_len; } switch(direz) { // Mi sposto a seconda della direzione case 0: a.x++; break; case 1: a.y++; break; case 2: a.x--; break; case 3: a.y--; break; } // Prossimo punto! Ora incrementerà il numero da scrivere (i) } } void disp_matrix(int *mtx, int n) { cout << endl << endl << endl << endl; for(int i=0; i<n; i++) { for(int j=0; j<n; j++) { cout<< mtx[i*n + j]<<'\t'; } cout << endl << endl << endl << endl; } }

Rispondi quotando