递归之青蛙过河

青蛙过河

Time Limit: 1000 ms Memory Limit: 65536 KiB

Submit Statistic Discuss

Problem Description

1)一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,石柱L面积只容得下一只青蛙落脚,同样右岸也有一石柱R,石柱R面积也只容得下一只青蛙落脚。 2)有一队青蛙从小到大编号:1,2,…,n。 3)初始时:青蛙只能趴在左岸的石头 L 上,按编号一个落一个,小的落在大的上面—–不允许大的在小的上面。 4)在小溪中有S个石柱、有y片荷叶。 5)规定:溪中的每个石柱上如果有多只青蛙也是大在下、小在上,每个荷叶只允许一只青蛙落脚。 6)对于右岸的石柱R,与左岸的石柱L一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。 7)当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶、溪中石柱跳至右岸R上的青蛙也不允许再离开。 问题:在已知小溪中有 s 根石柱和 y 片荷叶的情况下,最多能跳过多少只青蛙?

Input

输入数据有多组,每组占一行,每行包含2个数s(s是小溪中的石柱数目)、y(y是小溪中的荷叶数目)。(0 <= s <= 10,0 <= y <= 10),输入文件直到EOF为止!

Output

对每组输入,输出有一行,输出最多能跳过的青蛙数目。

Sample Input

0 2
1 2

Sample Output

3
6

Hint

Source

zlh

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
int  jump(int s,int y);
int main()
{
    int s,y;
    while(~scanf("%d%d",&s,&y))
    {
        printf("%d\n",jump(s,y));
    }
    return 0;
}
int  jump(int s,int y)
{  int t;
    if(s==0)t=y+1;
    else
    {
        t=2*jump(s-1,y);
    }
    return t;
}

Think:
这里我们先给出分析结果,再给出分析过程。经过分析我们可以得出的结论是:每增加一片荷叶,那么可以跳过的青蛙数加一;每增加一个石柱,可以跳过的青蛙数是原来的两倍。那么为什么是这个结果呢?下面我们一步步分析。

   1.首先考虑没有石柱的情况,即S=0。


      (1)当y=0时,只能跳过一只青蛙,由L直接跳到R。

      (2)当y=1时,可以跳过两只青蛙。过程为:青蛙1从L跳到荷叶上,青蛙2从L直接跳到R,最后青蛙1从荷叶跳到R。

      (3)当y=2时,可以跳过3只青蛙。过程为:青蛙1从L跳到荷叶1,青蛙2从L跳到荷叶2,青蛙3从L跳到R,青蛙2从荷叶2跳到R,青蛙1从荷叶1跳到R。

   由上面的例子我们可以看出,当只考虑荷叶时,每增加一片荷叶,跳过的青蛙数加一,即青蛙数为y+1。

   2.再考虑增加石柱的情况。

      (1)当S=1,y=0时,可以跳过两只青蛙。过程为:青蛙1从L跳到石柱上,青蛙2从L跳到R,青蛙1从石柱跳到R。

      (2)当S=1,y=1时,可以跳过4只青蛙。过称为:青蛙1从L跳到荷叶上,青蛙2从L跳到石柱上,青蛙1从荷叶上跳到石柱上,青蛙3从L跳到荷叶上,青蛙4从L跳到R,青蛙3从荷叶上跳到R,青蛙1从石柱上跳到荷叶上,青蛙2从石柱上跳到R,青蛙1从荷叶跳到R。

      上述过程可以总结为3步:步骤1:青蛙1和青蛙2借助荷叶跳到石柱上;步骤2:青蛙3和青蛙4借助荷叶跳到R;步骤3:青蛙1和青蛙2借助荷叶由石柱跳到R。

      (3)当S=1,y为任意值时,可以跳过2 * (y+1)只青蛙。过程可以理解为3步:步骤1:前y+1只青蛙借助荷叶跳到石柱上;步骤2:后y+1只青蛙借助荷叶跳到R;步骤3:前y+1只青蛙借助荷叶由石柱跳到R。

      (4)当S=2,y为任意值时,可以跳过4 * (y+1)只青蛙。显然当S=1时,y为相同值时可以跳过2 * (y+1)只青蛙。那么这个过程可以理解为:步骤1:前2 * (y+1)只青蛙利用荷叶和其中一个石柱(这里设为S1)从L跳到另外一根石柱(S2)上;步骤2:后2 * (y+1)只青蛙借助荷叶和S1从L跳到R;步骤3:前2 * (y+1)只青蛙从S2借助荷叶和S1跳到R

这里补充一下为什么是2*jump(s-1,y),假设有s根柱子,那么把最后一根看做是类似与R,这时候就要看S-1根柱子的时候是多少只青蛙,最后到真正的终点的时候就乘2即可,举个例子,当有一根柱子的时候就要看没有柱子时候有多少只青蛙,然后按照上面的原理乘2即可

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值