问题描述
螺旋方阵是指一个呈螺旋状的矩阵,它的左上角元素为1,由第一行开始按从左到右,从上到下,从从右向左,从下到上的顺序递增填充矩阵,直到矩阵填充完毕,下图所示是一个5*5阶的螺旋方阵。输入螺旋方阵的阶数N,按行输出该螺旋方阵。
输入说明
输入一个正整数N(1<N<=100)。
输出说明
逐行输出N阶螺旋方阵的元素,元素之间用空格分隔。
输入样例
6
输出样例
1 2 3 4 5 6
20 21 22 23 24 7
19 32 33 34 25 8
18 31 36 35 26 9
17 30 29 28 27 10
16 15 14 13 12 11
代码:
#include<stdio.h>
int main()
{
int n,i,j,b=1,z,sum=0;
scanf("%d",&n);
int a[n][n],e=(n+1)/2;
if(n%2==0)
{
for(z=0;z<n/2-1;z++)//计算圈数(一个正方形为一圈)
{
for(j=z,i=z;j<n-z&&i==z;j++,b++)//输出上边的公式
{
a[i][j]=b;
}
for(i=z+1;i<n-z&&j==n-z;i++,b++)//输出右边的公式
{
a[i][j-1]=b;//j在上面多加了一次
}
for(j=n-z-2;j>=z&&i==n-z;j--,b++)//输出下边的公式
{
a[i-1][j]=b;//i多加了一次
}
for(i=n-z-2;i>=z+1&&j==z-1;i--,b++)//输出左边的公式
{
a[i][j+1]=b;//j多减了一次
}
}
if(z==n/2-1)//最后一圈情况特殊
{
for(j=z,i=z;j<n-z&&i==z;j++,b++)
{
a[i][j]=b;
}
for(i=z+1;i<n-z&&j==n-z;i++,b++)
{
a[i][j-1]=b;
}
for(j=n-z-2;j>=z&&i==n-z;j--,b++)
{
a[i-1][j]=b;
}
a[n/2][n/2-1]=n*n;//补孔
}
}
if(n%2!=0)
{
for(z=0;z<(n-1)/2;z++)
{
for(j=z,i=z;j<n-z&&i==z;j++)
{
a[i][j]=b;
b++;
}
for(i=z+1;i<n-z&&j==n-z;i++)
{
a[i][j-1]=b;
b++;
}
for(j=n-z-2;j>=z&&i==n-z;j--)
{
a[i-1][j]=b;
b++;
}
for(i=n-z-2;i>=z+1&&j==z-1;i--)
{
a[i][j+1]=b;
b++;
}
}
a[e-1][e-1]=n*n;
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf("%d ",a[i][j]);
sum++;
if(sum%n==0) printf("\n");
}
}
return 0;
}
先分奇偶性:奇数最后要填补最中间一个数
主要思路就是一圈一圈地进行输入
然后要注意一些细节调整
本菜鸡在看到这个问题的时候就傻了,然后去搜了一下没有找到好理解的代码,但是确定了一个重要算法:一圈一圈输入,于是就找输入每一圈的通用公式,写出大致框架后再去修改细节。修改了一个小时.....这题总耗时快2个小时.....