算法题目
-
首先题目给出的例子都是带有提示性的,我们看n=3,n=4的异同,找出大致规律,得知我们要分奇偶数情况来输出
戳视频链接:螺旋阵视频讲解
再次声明,我没有备稿呀,有一点点憨憨的哈哈哈~
算法分析
-
这种类型题目,其实最关键的是我们要找出思路,我们应该怎么样来一步步的存储,这个问题解决了,基本上问题就得以解决了
-
我们这里以层为单位,每层又分为4个部分,左侧,下方,右侧,上方,并且设置外层循环变量i,内层循环变量j,我们需要找出i和j的关系即可
这里我画了一个图帮助大家理解:
-
在控制输出时,因为我们输入的n是不确定的,所以最大位数n*n的位数是不确定的,在控制输出时,应该使用 %*d,然后表示出星号即可
printf("%*d ",count,s[i][j]); //输入可变的位数应该用%*d
代码实现
#include<stdio.h>
//spiral array 螺旋阵
//1 12 11 10
//2 13 16 9
//3 14 15 8
//4 5 6 7
int s[100][100]; //大数组放在外面哦~
int main()
{
int n; //表示n*n矩阵
int i,j; //i表示外层循环变量 j表示层内循环变量
int k=1; //数组起始数据
int m; //m=n*n
int count=0; //存储m的位数
printf("请输入你想输出哪一阶矩阵(n):\n");
scanf("%d",&n);
m=n*n;
for(i=1;i<=n/2;i++)
{
for(j=i;j<=n-i;j++)
{
s[j][i]=k;
k++;
}
for(j=i;j<=n-i;j++)
{
s[n-i+1][j]=k;
k++;
}
for(j=n-i+1;j>=i+1;j--)
{
s[j][n-i+1]=k;
k++;
}
for(j=n-i+1;j>=i+1;j--)
{
s[i][j]=k;
k++;
}
}
if(n%2==1) //奇数行特殊处理
{
i=(n+1)/2;
s[i][i]=m;
}
while(m!=0)
{
count++;
m=m/10;
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
printf("%*d ",count,s[i][j]); //输入可变的位数应该用%*d
}
printf("\n");
}
return 0;
}
结果示例
- 示例一
- 示例二
- 示例三