0
点赞
收藏
分享

微信扫一扫

蛇形矩阵问题解析

善解人意的娇娇 2022-02-19 阅读 23

 蛇形矩阵题干如下所示:

题目分析:

根据题干中给出的蛇形矩阵例子,我们不难发现蛇形矩阵的特点:

本题要求我们求第二十行二十列的数字为多少。因此对于这个蛇形增长的矩阵,至少要生长到四十行四十列才可以容纳第二十行二十列的数字。因此在代码中我们为了避免编译器出现栈溢出的情况,我们创建42行42列的数组进行容纳。

图解:

对于这个题目有两种解法:

解法一:特殊位置找特殊的数量关系

题干要求我们求解第20行20列的矩阵元素,转化为二维数组形式,即为arr[19][19]

无论如何表示,题干让我们求解这个数是一个:行与列相等的数。

以这个蛇形矩阵为基础我们可以列举几个行列相等的数找寻规律:

[0][0] = 1  [1][1] = 5  [2][2] = 13    [3][3] = 25     [4][4] = 41

每次增加的数目都为4*n(n从1开始)

因此根据这一重要特性我们可以顺利的解决这一问题

解法一代码如下:

#include<stdio.h>
int main()
{
	int ret = 1;
	for (int i = 0; i < 20; i++)
	{
		ret = ret + i * 4;
	}
	printf("%d\n", ret);
	return 0;
}

 解法二:通法,适用于任何位置的数据计算

对于解法二在思维上应该是最先想到的方法,但在实际上的代码实现过程中是较为困难的,思维量较大。

解法二分析:

对于解法二,我们主要根据的是数据生长方向进行程序设计。对蛇形矩阵进行整体感知,我们可以发现这是一个非常规律的序列,生长的方式及其固定,方法极其简单。

关键是如何使程序能够正确的进行数据填充。

因此我们引入了变量index。index的最大作用就是控制数据的填充的方向。我们可以将蛇形序列斜着进行划分。如下图所示:

 第一行的index为0,自此index顺次增加。

我们使用一个for循环来控制index的数目,index在宏观上控制的是蛇形矩阵的大小。

我们再在index的for循环里控制生长方向,具体的控制过程见下面的代码:

#include<stdio.h>
int main()
{
	int i, j, x, y;
	int ret = 2;
	int num[41][41] = { 0 };
	num[0][0] = 1;
	for (int index = 1; index < 41; index++)
	{
		if (index % 2 == 1)
		{
			for (i = 0, j = index; i <= index && j >= 0; i++, j--)
			{
				num[i][j] = ret;
				ret += 1;
			}
		}
		else
		{
			for (j = 0, i = index; i >= 0 && j <= index; i--, j++)
			{
				num[i][j] = ret;
				ret += 1;
			}
		}
	}
	printf("%d\n", num[19][19]);
	return 0;
}
举报

相关推荐

蛇形矩阵;

蛇形矩阵

蛇形矩阵c语言

c++ 蛇形矩阵

C语言蛇形矩阵

蓝桥杯 1097蛇形矩阵

AcWing-756.蛇形矩阵

0 条评论