螺旋矩阵之(一)c语言简单实现及基本构思( 由内向外螺旋矩阵(逆序螺旋矩阵)、由外向内螺旋矩阵(正序螺旋矩阵)、字母螺旋矩阵、n阶螺旋矩阵、N*M | n*m阶螺旋矩阵等)
对于螺旋矩阵,说实话,我也是第一次接触。哈哈哈,刚开始的时候真心不知道怎么转圈圈,曾经想开一个二维方向数组(int next[4][2]={{0,1},{1,0},{0,-1},{-1,0}};)//利用这个神奇的家伙可以配合二维存储数组num[ ][ ],光荣的实现右下左上的全图搜索,如果把num数组存储空间当作一个图的话,哈哈哈。不过很可惜,无论是用递归回溯还是直接硬怼,都不可能转着圈来排,并且还把全图转了个遍。后来经过深思熟虑,还是得到一点有用的规律。
数组num如下 下标 0 1 2 3
| 1 | 2 | 3 | 4 |
| 12 | 13 | 14 | 5 |
| 11 | 16 | 15 | 6 |
| 10 | 9 | 8 | 7 |
当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;
}

更多推荐


所有评论(0)