PAT乙级(Basic Level)练习题 蜜蜂寻路

题目描述
nowcoder利用业余时间养了一窝蜜蜂,因为空间比较小,蜂房只有两排,如下图所示:
在这里插入图片描述
如你所见,蜜蜂的蜂房是正六边形,假设蜜蜂只会从左往右爬,即从1号蜂房能爬到2号和3号;从6号蜂房能爬到7号和8号……

现给出两个蜂房的编号a和b,要求计算蜂房a的蜜蜂爬到蜂房b有几条不同路线。

输入描述:

  1. 输入的第一行是一个整数n
  2. 接下来n行数据,每行一组测试用例
  3. 每组测试用例包含两个正整数a和b,(0 < a < b < 2^31)

输出描述:
每组用例的结果单独输出一行。输出数据结果范围是 [0, 2^63)。

输入例子:

3
1 2
3 6
99 100

输出例子:

1
3
1

\color{blue}解题思路:
在这里插入图片描述
由于排列规则可知,以及只能往左、右走,可知只有n-2n - 1到达n
那不就得出了f(n) = f(n - 1) + f(n - 2)么,这不就是斐波拉契尔数列问题么。。。

路线数 始、终差
1->1 1 0
1->2 1 1
1->3 2 2
1->4 3 3
1->5 5 4
1->6 8 5

1、1、2、3、5、8不就是一个斐波拉契尔数列么

\color{blue}代码实现:

#include <iostream>
using namespace std;

int main(int argc, const char * argv[]) {
    //建立一张表,用于记录f(n)各项值,注意数据溢出,使用long long型
    //由于斐波拉契尔数列第103项已经超过了2^63,并且题目说明结果不会超过2^63,因此计算1-102
    long long fTable[103] = {1, 1};
    for (int i = 2; i < 103; ++i) {
        fTable[i] = fTable[i - 1] + fTable[i - 2];
    }
    int count = 0;
    //scanf返回值为正确输入数据的变量个数,当一个变量都没有成功获取数据时,此时返回-1
    while (scanf("%d", &count) != - 1) {
        for (int i = 0; i < count; ++i) {
            int a = 0, b = 0;
            scanf("%d %d", &a, &b);
            printf("%lld\n", fTable[b - a]);
        }
    }
    return 0;
}

在这里插入图片描述

发布了1005 篇原创文章 · 获赞 269 · 访问量 22万+

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/104629461
今日推荐