lll条件是在nXn(n为基数)的二维数组里面arr[n/2+1][n/2+1]中心点填入数字1,在依次逆时针填入2,3,4......等自然数,先填内层最后填最外层。
思路:有两种写法,从一开始排序,和从25开始排序,但是无论从头开始还是从尾巴开始,都只有四个方向,即上下左右,从头开始即“右上左下”开始循环填入,但最后一排需要判读后在填入。从尾巴开始即“左上右下”开始循环填入,最后只需要将中心点赋值为1即可(前提n是奇数,不为奇数不用,这里列举从尾巴开始填入:
最后一个元素是:n*n;每一次赋值减小1,即:(n*n)--;
main函数:
int matrix[N][N];
int i,j,loop,count=N*N;
int n=N;
for(loop=0 ; loop<N/2 ; ++loop){
j=i=n-1;
for(j; j>loop ; --j) //左行
matrix[i][j] = count--;
for(i; i>loop ; --i) //上行
matrix[i][j] = count--;
for(j; j<n-1 ; ++j) //右行
matrix[i][j] = count--;
for(i; i<n-1; ++i) //下行
matrix[i][j] = count--;
n--;
}
if(N%2)
matrix[N/2][N/2] = 1;
Print(matrix);
return 0;
loop用来记这个循环可以循环几次,count记录最大值,每一次for循环的自增条件要先进增加后在运算,防止数组下标越界和定位不到的清况发生,下面是完整代码和运行结果:
#include <stdio.h>
#define N 5
void Print(int a[][5]){
int i,j;
for(i=0 ; i<N ; ++i){
for(j=0 ; j<N ;++j){
printf("%4d",a[i][j]);
}
printf("\n\n");
}
}
int main(void){
int matrix[N][N];
int i,j,loop,count=N*N;
int n=N;
for(loop=0 ; loop<N/2 ; ++loop){
j=i=n-1;
for(j; j>loop ; --j) //左行
matrix[i][j] = count--;
for(i; i>loop ; --i) //上行
matrix[i][j] = count--;
for(j; j<n-1 ; ++j) //右行
matrix[i][j] = count--;
for(i; i<n-1; ++i) //下行
matrix[i][j] = count--;
n--;
}
if(N%2)
matrix[N/2][N/2] = 1;
Print(matrix);
return 0;
}