栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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 
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 =row;i--)
            arr[col][i]=++count;//下行
        
        for(i=col-1;i>=row+1;i--)
            arr[i][row]=++count;//左列
        row++;
        col--;
    }
    
    //打印
    for(i=0;i 
补充: 

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

例如:我们的代码中,我们定义了行变量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 

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/954011.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号