将 1~n^2 的自然数顺时针(或逆时针)填入一个n阶方阵。当 n=5 时,填充效果如下:
ij → 1 2 3 4 5
↓
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
★ 思路: 1.总结填充 n阶方阵时规律:·
1.上行: i(纵坐标)不变, j(横坐标)改变:0 ~ N-1;
2.右行: i(纵坐标)改变:0 ~ N-1 j(横坐标)不变;
3.下行: i(纵坐标)不变 j(横坐标)改变: N-1 ~ loop;
4.左行: i(纵坐标)改变: N-1 ~ loop j(横坐标)不变; 2.将规律套用到每次遍历的每一圈,相当于缩小最外圈的规模,将每一次遍历都看作是最外层的填充:
3.如果是逆时针填充,按照相同思路进行。 ★ 代码实现★ #include <stdio.h>#define N 5void 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("nn");}}int main(void){int matrix[N][N];int i,j,loop,count=0;//单独记录 N 的值,使到非最外圈的时候能按//比例缩小规模 int n=N;for(loop=0 ; loop<N/2 ; ++loop){i=loop;j=i;for(j; j<n-1 ; ++j) //上行 matrix[i][j] = ++count;for(i; i<n-1; ++i) //右行 matrix[i][j] = ++count;for(j; j>loop ; --j) //下行matrix[i][j] = ++count;for(i; i>loop ; --i) //左行matrix[i][j] = ++count;n--; //缩小规模时,使规律同步 }//若 N 为奇数时,以上操作无法填充完最中间//的那个空,则需要单独填充if(N%2) matrix[N/2][N/2] = N*N;Print(matrix);return 0; }