题目描述
看着这样的“回”形图案你晕吗?让我们不用数组,来做出它。
输入:
n。正方形的边长
输出:
边长为 n 的数字回形方阵。
解题思路
打印方形图案+不能按顺序逐行打印,小橘第一反应就是用数组,但是题目要求不要用数组:)汗。。
不过没关系,咱们先用数组看看能不能做出来,然后再把其转成不用数组的形式
打印不能逐行顺序打印的数字图形,关键在于定义好移动方向。此题中,数字按右、下、左、上的顺序方向移动,每四个为一周期。于是乎,我们的解题思路就是:定义数组——>定义移动方向——>根据不同的移动方向改变行列数和数字——>打印图形。
关键参数解释
flag:移动方向的标志。右为1,下为2,左为3,上为4。
count:移动方向的周期数。每一周期加一,因为随着“回”字内缩,数字移动步长也会内缩。
完整代码(用数组版)
#include<stdio.h>
#include<stdlib.h>
//数字图形的关键在于定义移动方向
void circle_square(int n)
{
// //定义动态数组
// int **square=(int **)malloc(n*sizeof(int *));
// for (int i=0;i<n;i++)
// {
// square[i]=(int *)malloc(n*sizeof(int));
// }
int square[n][n];
int row=0,col=0,i,j,num=1,count=0;
int flag=1;
while(num<=n*n)
{
square[row][col]=num++;
if(flag==1)//向右
{
if(col!=n-count-1)
col++;
else
{
flag=2;
row++;
}
}
else if(flag==2)//向下
{
if(row!=n-count-1)
row++;
else
{
flag=3;
col--;
}
}
else if(flag==3)//向左
{
if(col!=count)
col--;
else
{
flag=4;
row--;
}
}
else if(flag==4)//向上
{
if(row!=count+1)
row--;
else
{
flag=1;
col++;
count++;
}
}
}
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf(" %2d",square[i][j]);
}
printf("\n");
}
}
int main()
{
int n,i,j;
scanf("%d",&n);
circle_square(n);
return 0;
}
实现了数组方式,下面对其进行改造。
完整代码(不用数组版)
#include<stdio.h>
#include<stdlib.h>
//数字图形的关键在于定义移动方向
int circle_square(int i,int j,int n)
{
int row=0,col=0,num=1,count=0;
int flag=1;
for(num=1;num<=n*n;num++)
{
if(i==row && j==col)
return num;
if(flag==1)//向右
{
if(col!=n-count-1)
col++;
else
{
flag=2;
row++;
}
}
else if(flag==2)//向下
{
if(row!=n-count-1)
row++;
else
{
flag=3;
col--;
}
}
else if(flag==3)//向左
{
if(col!=count)
col--;
else
{
flag=4;
row--;
}
}
else if(flag==4)//向上
{
if(row!=count+1)
row--;
else
{
flag=1;
col++;
count++;
}
}
}
}
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
printf(" %2d",circle_square(i,j,n));
}
printf("\n");
}
return 0;
}
两个版本的区别其实就是不用数组的话,得多引入两个形参在函数中方便后续打印。
以上就是小橘关于此题的思考,水平有限,如有考虑不周之处还请大家不吝赐教:)