Io seguo un approccio leggermente diverso: data una matrice quadrata, se riesco a compilare i lati esterni in senso orario partendo dal numero 1, poi mi resta da compilare la sottomatrice che ottengo togliendo i 4 lati esterni; dopo la prima passata ottengo:
(O = posizione compilata; X = posizione non compilata)
overo dopo la prima passata miresta da compilare una sottomatrice quadrata di dimesione (N-2)(N-2)codice:O O O O O O X X X O O X X X O O X X X O O O O O O
posso allora ripetere il procedimento per tale sottomatrice.
Quindi posso fare un ciclo, e all'interno di ogni iterazione compilo i 4 lati della sottomatrice corrente. per compilare i 4 lati di una mtrice N*N procedo cosi:
lato superiore: N elementi che raggiungo incrementando la coordinata y;
lato destro: N-1 elementi che raggiungo incrementando la coordinata x;
lato inferiore: N-1 elementi che raggiungo decrementando la coordinata y;
lato sinistro: N-2 elementi che raggiungo decrementanto la coordinata x;
quindi posso fare 4 cicli for, uno per ogni lato per compilare tutti e quattro i lati.
Ecco il programma C++ (non C!)
codice:#include <iostream> #define N 5 void init_mat(int mat[N][N]){ //num rappresenta il numero di elementi in un lato //della sottomatrice corrente int num = N; //done rappresenta il numero di elementi compilati in tutto int done = 0; //x e y rappresentano le coordinate correnti int x = 0; int y = -1; while(done < N * N){ //compilo il lato superiore spostandomi a destra for(int i = 0; i < num; i++){ y++; done++; mat[x][y] = done; } //compilo il lato destro spostandomi in basso for(int i = 0; i < num - 1; i++){ x++; done++; mat[x][y] = done; } //compilo il lato inferiore spostandomi a sinistra for(int i = 0; i < num - 1; i++){ y--; done++; mat[x][y] = done; } //compilo il lato sinistro spostandomi in alto for(int i = 0; i < num - 2; i++){ x--; done++; mat[x][y] = done; } //la nuova prossima sottomatrice avrà dimensione //decrementata di 2 num -= 2; } } void stampa(int mat[N][N]){ for(int i = 0; i < N; i++){ for(int j = 0; j < N; j++){ std::cout << mat[i][j] << " "; } std::cout << "\n"; } } int main(){ int mat[N][N]; init_mat(mat); stampa(mat); return 0; }![]()

Rispondi quotando