PTA7-1 螺旋方阵(15分)
程序员文章站
2022-03-13 13:41:53
...
题目
代码博主都是亲测过的,还请大家,放心食用。先代码后解析。
代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int a[10][10],n,i,j,w1,w2,w3,w4,x=0,y=0,k=1,d=0;
scanf("%d",&n);
w1=n-1,w2=n-1,w3=0,w4=1;
while(k<=n*n)
{
if(d==0)
{
a[x][y++]=k++;
if(y==w1)
{
d=1;
w1--;
}
}
if(d==1)
{
a[x++][y]=k++;
if(x==w2)
{
d=2;
w2--;
}
}
if(d==2)
{
a[x][y--]=k++;
if(y==w3)
{
d=3;
w3++;
}
}
if(d==3)
{
a[x--][y]=k++;
if(x==w4)
{
d=0;
w4++;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
printf("%4d",a[i][j]);
printf("\n");
}
return 0;
}
- 首先在看这道题目的时候小伙伴们不要抓着题意去看,我们看他的输出结果。博主在看到输出结果的时候第一想法不是想办法让1~n按这种别扭的方式输出,而是按这种排列对一个二维数组赋值。之后博主会讨论直接输出的办法。
- 这里还是建议大家采用循环赋值的方法,也就是转着转着赋值,这样的话,我们就可以用到对数组赋值的变量k,将其设置为大循环while的循环控制。为了这样做,我们可以设置四个变量,我这里称这些变量我们为墙 即wall,所以我用w来命名这四个变量。我们可以试着在脑子里跑一下第一圈,从1~9对第一行对应的索引0到8九个位置进行赋值,接着我们的判断条件d变为1,开始对最后一列的赋值,对第y列从10到18,接着继续转,这里的x变为自减,从索引9到1进行赋值,最后我们又回到第一列,从9到2进行赋值,然后从第一列,第二行继续开始循环,思路简单。
这里我们可以尝试讨论一下其他的方法,如果我们采用对二维数组先顺序赋值的话,那么不论我们怎么操作,都会面对一个问题,即换行,换行是问题的关键,如果我们尝试其他方法,就会发现,换行问题非常大,博主目前没有其他办法解决这个问题,而且博主已经尝试过两种不同的方法了,所以要是有小伙伴有其他方法的话,还望分享给博主。ok bye~
上一篇: 方阵循环右移 (20分)
下一篇: 6-10 阶乘计算升级版 (20分)