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;
}
grazie mille...

se tu fossi una ragazza ti bacerei!