Time Limit: 1000 ms Memory Limit: 65536 KiB
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
思路:
两群青蛙,左右三只,中间有一块空地,左边只能向右跳,右边的只能向左跳,一次只能跳一格或者跨过一个障碍跳一格。
这个有两种思路,一种是先想清楚什么时候会阻塞,这个问题我们可以这样考虑,如果要这些青蛙都不能动的话,那么我们假设有两个同向的青蛙不在它本来的地方却又没有达到对岸的时候相邻在一起了,那么我们可以知道,这个时候就阻塞了,因为后面动从而造成这个局面的青蛙势必是从另一个方向过来的,也就是说,这两个相邻的青蛙的前进方向上没有空位,那么就肯定会造成阻塞了。这里没有问题的话,我们逆推回去,那么如果是右,左,空,右的情况的时候,其实没有什么好的办法,只能是右边那个过来空的地方,或者是右的右边有左方向的青蛙过来,但是不管怎么样,这里肯定是会阻塞的了,就是说空的左边是左,右边是右,这样就肯定不行的了。那么我们要怎么做也就很清楚了,判断好每一步,如果可以跳着走就跳着走,不过每一次走之前都要检测下一步会不会形成空的左边是左右边是右的情况。
还有一种思路就是纯粹的走迷宫,就是用深度二叉树的思想,只要走不通就回头走,就是说如果遇到阻塞的情况,那就说明上一步有问题,就返回就好。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int f(int a,int b)
{
int k;
if(a==0)
{
k=b+1;
}
else
{
k=2*f(a-1,b);
}
return k;
}
int main()
{
int s,y,sum;
while(~scanf("%d %d",&s,&y))
{
sum=0;
if(s>10||y>10)
{
break;
}
sum=f(s,y);
printf("%d\n",sum);
}
return 0;
}