题目
如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?
题解一 (模拟):
对数字的递增顺序进行观察,
![](https://img-blog.csdnimg.cn/img_convert/8eae1edc2e4657abca0c2541520179dd.png)
我们可以发现其特殊情况((位置坐标以一开始):
(1)横轴方向
当其坐标为奇数时,向右移动,否者向左下移动
(2)竖轴方向
当其坐标为奇数时,向右上移动,否者,向下移动;
(3)两轴所围成的区域内;横纵坐标之和为偶数,向右上移动,横纵坐标之和为奇数,向左下移动;
注意:起点处是向右递增的,即满足(1)的规律,而(2)的规律不满足,我们只需将(1)放在(2)条件的即可;
代码一:
#include<iostream>
const int N = 1e2 + 10;
using namespace std;
int g[N][N];
int main()
{
int ans=1;
int x= 1, y = 1;
while (x != 20 || y != 20)
{
if (x == 1)
{
if (y % 2) y++;
else y--,x++;
}
else if (y == 1)
{
if (x % 2)x--, y++;
else x++;
}
else
{
if ((x + y) % 2 == 0)x--, y++;
else x++, y--;
}
ans++;
}
cout << ans << endl;
return 0;
}
题解二(计算):
我们对斜线进行编号,
![](https://img-blog.csdnimg.cn/img_convert/674725299e673135b558b9b813297ec1.png)
1.斜线的编号对于给线的数字个数;而n根线的最大值等于(1+n)*n/2.
2.坐标以1开始,当数的横纵坐标相加为偶数是,数值向右上递增;
反之,左下递增.
3.而n=i+j-1(易于推导,对横轴上某一点进行分析);
4.横纵坐标相加为偶数,最大值减去i-1,反之,减去j-1.(i为纵轴。j为横轴
代码二:
#include<iostream>
using namespace std;
int i, j, f;
int main()
{
cin >> i >> j;//i为纵轴,j为横轴;
f = (i + j) * (i + j - 1) / 2;
if ((i + j) % 2 == 0)
f -= (i-1);
else
f -= (j-1);
cout << f << endl;
}
![](https://img-blog.csdnimg.cn/img_convert/a055c889488714283507140a509a5c19.jpeg)