C语言填充矩阵(逆时针螺旋),具体问题在图片上了,谢谢大家,求求了[face]emoji:054.p

C语言填充矩阵(逆时针螺旋),具体问题在图片上了,谢谢大家,求求了[face]emoji:054.png[/face]
#include<stdio.h>
int main() {
    int n, direcion[4][2] = {{0,-1},{1,0},{0,1},{-1,0}};
    scanf("%d",&n);
    int num[2*n];
    num[1] = n;
    for(int i=2, n_=n-1;i<=2*n-1;i=i+2,n_--){
        num[i] = n_;
        num[i+1] = n_;
    }

    int x=0,y=n,point[n][n];
    int nu=1,k=0,j=0;
    for(int i=1;i<=n*n;i++){
        x = x+direcion[j%4][0], y = y+direcion[j%4][1];
        point[x][y] = i;
        k++;
        if(k==num[nu]){
            nu++;
            k=0;
            j++;
        }
    }
    for(int i=0;i<n;i++){
        for(int g=0;g<n;g++)
            printf("%4d",point[i][g]);
        printf("\n");
    }
    return 1;
}

这个是有规律可循的。

我以n=6为例子找规律。

从[0,5]开始,填充6个数字,然后填充5个数字,然后填充5个数字,然后4个,4个,3,3,2,2,1,1.分别填充的数字个数是这些。

所以代码中num数组的内容就是这些[6,5,5,4,4,3,3,2,2,1,1]

point数组记录的就是整个二位数组的内容。x和y分别是下标

direction数组,分别是x和y的改变量,因为左下右上,只有四种改变,所以direction也是四种,轮着来用。

用变量k记录当前填充了几个数字了,如果等于num数组中对应的数,就做三个改变:num的下标nu加一(表示该填充下一个数量的数字了)、k归零(表示重新计数)、坐标xy的改变量也要变。

挺有意思的