对于螺旋矩阵,说实话,我也是第一次接触。哈哈哈,刚开始的时候真心不知道怎么转圈圈,曾经想开一个二维方向数组(int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};)//利用这个神奇的家伙可以配合二维存储数组num[ ][ ],光荣的实现右下左上的全图搜索,如果把num数组存储空间当作一个图的话,哈哈哈。不过很可惜,无论是用递归回溯还是直接硬怼,都不可能转着圈来排,并且还把全图转了个遍。后来经过深思熟虑,还是得到一点有用的规律。

                  数组num如下                               下标   0     1      2      3

1234
1213145
1116156
10987

当n=4的时候,num是四阶方阵。转着圈来排,很容易想到,每转一圈,上下和左右都兼顾到了。其实顶多转个n/2次 全图就都兼顾到了。(n=4是偶数)

所以我们就要在这里做文章,先写最外面的for,它只能跑两趟,n是4,这个时候从零开始是for(int i=0;i<n/2;i++)。

里面需要四个for,每次控制好起步和落脚点的限制,可以很好的实现全图转圈圈。

但是这样写当n是奇数的时候,会发现,最里面的元素没有上数。

这是因为转的还是差一次,那就再转一圈,改写for(int i=0;i<=n/2;i++);

这样就好了。

不过其实里面i和j做了很多限制,你就是多让它转几圈,它由于里面四个for都不执行,还是原来的结果。

比如让for(int i=0;i<=n;i++);

接下来上代码!不懂可以问我,嘿嘿!


N阶螺旋矩阵

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int num[20][20];
int main()
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
        int n;
        scanf("%d",&n);
        int i,j;
        int js=1;
        memset(num,0,sizeof(num));
        for(i=0; i<=n/2; i++)
        {
            for(j=i; j<=n-i-1; j++)
            {
                num[i][j]=js++;
            }
            for(j=i+1; j<=n-i-1; j++)
            {
                num[j][n-i-1]=js++;
            }
           for(j=n-i-2;j>=i;j--)
           {
               num[n-i-1][j]=js++;
           }
           for(j=n-i-2;j>i;j--)
           {
               num[j][i]=js++;
           }
        }
            for(int i=0; i<n; i++)
            {
                for(int j=0; j<n; j++)
                    printf("%5d",num[i][j]);
                printf("\n");
            }
    }

    return 0;
}


当然螺旋矩阵既可以由外向里,又可以由里向外。

两个思想完全一样,只不过让js这个变量,每次减一。

//螺旋矩阵的变形
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int num[20][20];
int n;
int main()
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
        scanf("%d",&n);
        int j=0;
        int js=n*n;
        for(int i=0;i<=n/2;i++)
        {
            for(j=i;j<n-i;j++)
                num[i][j]=js--;
            for(j=i+1;j<n-i;j++)
                num[j][n-i-1]=js--;
            for(j=n-i-2;j>=i;j--)
                num[n-i-1][j]=js--;
            for(j=n-i-2;j>i;j--)
                num[j][i]=js--;
        }
        for(int i=0;i<n;i++)
        {
            for(int j=0;j<n;j++)
            {
                printf("%3d",num[i][j]);
            }
            printf("\n");
        }
    }
     return 0;
}


——————————————————————————————————

更新于2020.6.22 20:53

对于一些同学问我的问题,我做出回答   螺旋矩阵之(二) 进阶版的螺旋矩阵_nyist_yangguang的博客-CSDN博客

问题一:n*m矩阵怎么写?

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int num[20][20];
int main() {
	int N;
	scanf("%d",&N);
	while(N--) {
		int n,m;
		scanf("%d %d",&n,&m);
		int i,j;
		int js=1;
		memset(num,0,sizeof(num));
		int xh1=n>m?m:n;
		for(i=0; i<xh1/2; i++) {
			for(j=i; j<=m-i-1; j++) {
				num[i][j]=js++;
			}
			for(j=i+1; j<=n-i-1; j++) {
				num[j][m-i-1]=js++;
			}
			for(j=m-i-2; j>=i; j--) {
				num[n-i-1][j]=js++;
			}
			for(j=n-i-2; j>i; j--) {
				num[j][i]=js++;
			}
		}
		if(xh1%2) {
			for(j=i; j<=m-i-1; j++) {
				num[i][j]=js++;
			}
			for(j=i+1; j<=n-i-1; j++) {
				num[j][m-i-1]=js++;
			}
		}

		for(int i=0; i<n; i++) {
			for(int j=0; j<m; j++)
				printf("%5d",num[i][j]);
			printf("\n");

		}
	}
	return 0;
}

问题二:n阶字母螺旋矩阵怎么写?



#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char num[20][20];
int main()
{
    int N;
    scanf("%d",&N);
    while(N--)
    {
        int n;
        scanf("%d",&n);
        int i,j;
        int js='A';
        memset(num,0,sizeof(num));
        for(i=0; i<=n/2; i++)
        {
            for(j=i; j<=n-i-1; j++)
            {
                if(js>'Z')
                    js=js-1-'Z'+'A';
                num[i][j]=js++;
            }
            for(j=i+1; j<=n-i-1; j++)
            {
                if(js>'Z')
                    js=js-1-'Z'+'A';
                num[j][n-i-1]=js++;
            }
            for(j=n-i-2; j>=i; j--)
            {
                if(js>'Z')
                    js=js-1-'Z'+'A';
                num[n-i-1][j]=js++;
            }

            for(j=n-i-2; j>i; j--)
            {
                if(js>'Z')
                    js=js-1-'Z'+'A';
                num[j][i]=js++;
            }
        }
        for(int i=0; i<n; i++)
        {
            for(int j=0; j<n; j++)
                printf("%5c",num[i][j]);
            printf("\n");

        }
    }
    return 0;

}

更多推荐