这是2000年全国青少年信息学奥林匹克竞赛的一道试题。
问题描述:一条小溪尺寸不大,青蛙可以从左岸跳到右岸。在左岸有一石柱L,面积只容得下一只青蛙落脚,同样右岸也有一石柱R,面积也只容得下一只青蛙落脚。有一队青蛙从尺寸上一个比一个大,将青蛙从小到大编号,分别是1号、2号、3号……,规定初始时这队青蛙只能趴在左岸的石柱L上,按编号顺序一个摞一个,小的摞在大的上面,不允许大的摞在小的上面。在小溪中有s个石柱,y片荷叶,规定溪中的柱子上允许一只青蛙落脚,如有多只,同样要求按编号顺序一个摞一个,大的在下,小的在上,而且必须编号相邻。对于荷叶,只允许一只青蛙落脚,不允许多只在其上。对于右岸的石柱R,与左岸的石柱L一样面积只容得下一只青蛙落脚,多个青蛙落在上面必须一个摞一个,大的在下,小的在上,且编号相邻。青蛙从左岸的L跳走就不许再跳回来,从左岸L跳至右岸R,或从溪中荷叶或溪中石柱跳至右岸R上的青蛙也不允许再离开。问在已知溪中有s根石柱和y片荷叶的情况下,最多能跳过多少只青蛙?
#include <iostream>
using namespace std;
int main()
{
int Jump(int s, int y);
int s = 0, y = 0, sum = 0;
cout << "请输入石柱个数 s:";
cin >> s;
cout << "请输入荷叶片数 y:";
cin >> y;
sum = Jump(s,y);
cout << "最多能跳过" << sum << "只青蛙!" << endl;
return 0;
}
int Jump(int s, int y)
{
int k = 0;
if(s == 0)
k = y + 1;
else
k = 2 * Jump(s - 1, y);
//代码很简单,但是思考到这一层,不简单
return k;
}
在s = 15, y = 15 的情况下,居然可以跳过五十多万只青蛙!递归的力量是伟大的!: