C语言入门语法题详解(3)

这篇博客介绍了如何用C语言实现两种矩阵填充方式:回型矩阵和蛇形矩阵。代码详细解释了逻辑过程,强调了边界条件判断和方向变化的重要性。回型矩阵从中心向外填充,蛇形矩阵则按照右上-左下-左上-右下的顺序交替填充。这两个挑战旨在训练程序员的逻辑思维和数组操作技巧。
摘要由CSDN通过智能技术生成

1.回型矩阵

题目描述:

给你一个整数n,按要求输出n∗n的回型矩阵。

输入输出要求:

输入要求:输入一行,包含一个整数n,1<=n<=19。

输出要求:输出n行,每行包含n个正整数.

输入输出案例:

案例1

输入:4

输出: 1   2   3  4
           12 13 14 5
           11 16 15 6
           10  9   8  7

代码实现:

#include <stdio.h>
int main()
{
    //输入n
    int n=0;
    scanf("%d",&n);

    //定义二维数组
    int arr[20][20]={0};

    //定义行、列边界
    int row=0;
    int col=n-1;

    //定义控制行、列变量
    int i=0;
    int j=0;

    //计数
    int count=0;

    while(count <n*n)
    {
         for(i=row;i<=col;i++)
            arr[row][i]=++count;//上行
        
        for(i=row+1;i<=col;i++)
            arr[i][col]=++count;//右列
        
        for(i=col-1;i>=row;i--)
            arr[col][i]=++count;//下行
        
        for(i=col-1;i>=row+1;i--)
            arr[i][row]=++count;//左列
        row++;
        col--;
    }
    
    //打印
    for(i=0;i<n;i++)
    {
        for(j=0;j<n;j++)
        {
            printf("%d ",arr[i][j]);
        }
        printf("\n");
    }
    return 0;
}

补充:

本题并不是一个特别难的题,它是一个简单题。而它的难点在于不能跳跃思维惯性

例如:我们的代码中,我们定义了行变量row、i,定义了列变量col、j。现在我们知道行变量是控制行的,列变量是控制列的。但是行就不能写成列?列就不能写成行?实际上,row、i、col、j等等这些变量的本质还是数字,只不过我们为了方便强行赋予某某变量具有什么什么作用而已。

比如代码中的这串代码:

for(i=row;i<=col;i++)
            arr[row][i]=++count;//上行

可以看到 i 写到列下标去了。事实上我们打印二维数组最上行,需要的就是列变量是变化的,行变量是不动的。

2.蛇型矩阵

题目描述:

给你一个整数n,输出n∗n的蛇形矩阵。

输入输出要求:

输入要求:输入一行,包含一个整数n

输出要求:输出n行,每行包含n个正整数,通过空格分隔。1<=n<=1000

输入输出案例:

案例1

输入:4

输出:1 2 6 7
           3 5 8 13
           4 9 12 14
          10 11 15 16

代码实现:

#include <stdio.h>

int main()
{
    //输入n
	int n = 0;
	scanf("%d", &n);

    //定义二维数组
	int arr[100][100] = { 0 };

    //第一个点位
	arr[0][0] = 1;

    //从2开始计数
	int count = 2;

    //控制行、列变量
	int i = 0;
	int j = 0;

    //state为1,往右上方打印;state为-1,往左下打印
	int state = 1;

	while (count <= n * n)
	{
        //最上行,并改变方向
		if (state == 1 && i == 0 && j < n - 1)
		{
			arr[i][++j] = count++;
			state = -1;
		}

        //最左列,并改变方向
		else if (state == -1 && j == 0 && i < n - 1)
		{
			arr[++i][j] = count++;
			state = 1;
		}

        //最右列,并改变方向
		else if (state == 1 && j == n-1 && i < n - 1)
		{
			arr[++i][j] = count++;
			state = -1;
		}

        //最下行,并改变方向
		else if (state == -1 && i == n - 1 && j < n - 1)
		{
			arr[i][++j] = count++;
			state = 1;
		}

        //当方向为右上
		else if (state == 1)
		{
			arr[--i][++j] = count++;
		}

        //当方向为左下
		else if (state == -1)
		{
			arr[++i][--j] = count++;
		}
	}

    //打印
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			printf("%d ", arr[i][j]);
		}
		printf("\n");
	}
	return 0;
}

补充:

通过观察代码可以发现逻辑非常简单:

我们可以通过观察这幅图就不难理解上面的代码。只有在边界才会出现紫色箭头连续+1的情况,每次出现这种情况必然会带有方向的改变。

上面的代码 if else 的顺序是可以变的,大家可以尝试一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小龙向钱进

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值