蛇形矩阵问题解析

 蛇形矩阵题干如下所示:

题目分析:

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

蛇形矩阵的延申方向只有右,下,斜方向

延长过程中,左下延长与右上延长交替进行

蛇形矩阵的起始数字为1

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

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值