H. 晕(选作)打印“回”字图形

 题目描述

看着这样的“回”形图案你晕吗?让我们不用数组,来做出它。

输入:
    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;
}

两个版本的区别其实就是不用数组的话,得多引入两个形参在函数中方便后续打印。

以上就是小橘关于此题的思考,水平有限,如有考虑不周之处还请大家不吝赐教:)

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值