蛇形矩阵题干如下所示:
题目分析:
根据题干中给出的蛇形矩阵例子,我们不难发现蛇形矩阵的特点:
蛇形矩阵的延申方向只有右,下,斜方向
延长过程中,左下延长与右上延长交替进行
蛇形矩阵的起始数字为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;
}