蛇形填数--蓝桥杯笔记

题目

如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。

1 2 6 7 15 ...
3 5 8 14 ...
4 9 13 ...
10 12 ...
11 ...
...

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?

题解一 (模拟):

  1. 对数字的递增顺序进行观察,

我们可以发现其特殊情况((位置坐标以一开始):

(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;
}

题解二(计算):

我们对斜线进行编号,

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;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值