目录
一. 问题描述
Problem Description
(1)一条小溪尺寸不大,青蛙可以从左岸跳到右岸,在左岸有一石柱L,石柱L面积只容得下一只青蛙落脚,同样右岸也有一石柱R,石柱R面积也只容得下一只青蛙落脚。(2)有一队青蛙从小到大编号:1,2,…,n。初始时青蛙们只能趴在左岸的石头 L 上,按编号一个落一个,小的落在大的上面,不允许大的在小的上面。(3)在小溪中有S个石柱、有y片荷叶。规定溪中的每个石柱上如果有多只青蛙也是大在下、小在上,每个荷叶只允许一只青蛙落脚。(4)对于右岸的石柱R,与左岸的石柱L一样允许多个青蛙落脚,但须一个落一个,小的在上,大的在下。(5)当青蛙从左岸的L上跳走后就不允许再跳回来;同样,从左岸L上跳至右岸R,或从溪中荷叶、溪中石柱跳至右岸R上的青蛙也不允许再离开。则问题是在已知小溪中有 s 根石柱和 y 片荷叶的情况下,最多能跳过多少只青蛙?Input
输入数据有多组,每组占一行,每行包含2个数s(s是小溪中的石柱数目)、y(y是小溪中的荷叶数目)。(0 <= s <= 10,0 <= y <= 10),输入文件直到EOF为止!Output
对每组输入,输出有一行,输出最多能跳过的青蛙数目。Example Input
0 2
1 2Example Output
3 6
二. 题解及代码
此处推导一下青蛙数量与石柱和荷叶之间的关系:
(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;
}