递归专练E 汉诺塔系列之青蛙过河

来源:互联网 发布:淘宝虚拟现实购物 编辑:程序博客网 时间:2024/05/26 08:42

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

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

Example Input

0 21 2

Example Output

36
————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————
推一下青蛙数量与石柱和荷叶之间的关系:
1.单独考虑荷叶(即s=0,y存在)
当有一片荷叶时:可以通过2只青蛙
当有两片荷叶时:可以通过3只青蛙
当有三片荷叶时:可以通过4只青蛙
当有y片荷叶时:可以通过y+1只青蛙
2.考虑有石柱的情况:
s=0,y时:可以过y+1只;
s=1,y时:先把y+1只青蛙借助荷叶转移到石柱上,再把y+1只青蛙借助荷叶转移到R石柱上,再把石柱上的y+1只青蛙借助荷叶转移到对岸,共转移2*(y+1)只青蛙
s=2,y时:先把y+1只青蛙借助荷叶转移到石柱1上,再把y+1只青蛙借助荷叶转移到石柱2上,再把石柱1上的青蛙借助荷叶转移到石柱2上(此时石柱2)上有2*(y+1)只,再把y+1只青蛙借助荷叶转移到石柱1上,再把y+1只青蛙转移到右岸上,再把池塘里的3*(n+1)转移到右岸上,共4*(n+1)
可以看作先把s=1时的2*(n+1)转移到石柱,再把2*(n+1)转移到对岸,再把石柱上转移到对岸。
s=3,y时,先4*(n+1)到石柱,再4*(n+1)到对岸,再把石柱上转移到对岸共8*(n+1)
.....
每一个都是前一个s的两倍
number(s,y)=2*number(s-1,y);
#include <stdio.h>int number(int a,int b){    if(a==0)//因为s=0时,数目已知所以当作递归结束条件(两个未知数)        return b;    else        return number(a-1,b)*2;//每一个都是前一个两倍,直到a==0}int main(){    int s,y;    while(scanf("%d%d",&s,&y)!=EOF)    {        printf("%d\n",number(s,y+1));    }    return 0;}

原创粉丝点击