Originariamente inviato da anx721
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)
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
overo dopo la prima passata miresta da compilare una sottomatrice quadrata di dimesione (N-2)(N-2)
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;
}