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

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 的顺序是可以变的,大家可以尝试一下。

猜你喜欢

转载自blog.csdn.net/weixin_59913110/article/details/125172444