青蛙过河

Posted hhyx

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了青蛙过河相关的知识,希望对你有一定的参考价值。

# 题意
左,右各一个塔,这个塔一旦放上就不能在动,小溪中n个塔,m片叶,柱可以摞任意数量但服从汉诺塔,叶子只能放一个,而且二者任意一个移动到右边的柱子上后就不允许离开,问最多可以跳过多少只青蛙

# 题解
一、 首先考虑没有石柱的情况,即n=0。
1) 当m=0时,只能跳过一只青蛙,由L直接跳到R。
2) 当m=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。
4) 由上面的例子我们可以看出,当只考虑荷叶时,每增加一片荷叶,跳过的青蛙数加一,即青蛙数为m+1。
二、 有石柱的情况
1) 当n=1,m=0时,可以跳过两只青蛙。过程为:青蛙1从L跳到石柱上,青蛙2从L跳到R,青蛙1从石柱跳到R。
2) 当n=1,m=1时,可以跳过4只青蛙。过程为:
青蛙1从L跳到荷叶上,
青蛙2从L跳到石柱上,青蛙1从荷叶上跳到石柱上,
青蛙3从L跳到荷叶上,青蛙4从L跳到R,青蛙3从荷叶上跳到R,青蛙1从石柱上跳到荷叶上,青蛙2从石柱上跳到R,青蛙1从荷叶跳到R。
步骤1:青蛙1和青蛙2借助荷叶跳到石柱上;
步骤2:青蛙3和青蛙4借助荷叶跳到R;
步骤3:青蛙1和青蛙2借助荷叶由石柱跳到R。
3) 当n=1,m为任意值时,可以跳过2 * (m+1)只青蛙。过程可以理解为3步:
步骤1:前m+1只青蛙借助荷叶跳到石柱上;
步骤2:后m+1只青蛙借助荷叶跳到R;
步骤3:前m+1只青蛙借助荷叶由石柱跳到R。
4) 当n=2,m为任意值时,可以跳过4 * (m+1)只青蛙。显然当n=1时,m为相同值时可以跳过2 * (m+1)只青蛙。那么这个过程可以理解为:
步骤1:前2 * (m+1)只青蛙利用荷叶和其中一个石柱(这里设为S1)从L跳到另外一根石柱(S2)上;
步骤2:后2 * (m+1)只青蛙借助荷叶和S1从L跳到R;
步骤3:前2 * (m+1)只青蛙从S2借助荷叶和S1跳到R
结论 n个石柱的移动次数是n-1个石柱移动次数的两倍,t=2*jump(n-1,m);

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,m;
 4 int jump(int n,int m){
 5     int t;
 6     if(n==0)
 7         t=m+1;
 8     else {
 9         t=2*jump(n-1,m);
10     }
11     return t;
12 }
13 int main(){
14     while(scanf("%d%d",&n,&m)!=EOF){
15         printf("%d
",jump(n,m));
16     }
17     return 0;
18 }

 

以上是关于青蛙过河的主要内容,如果未能解决你的问题,请参考以下文章

403 Frog Jump 青蛙过河

青蛙过河(二分+并查集)

递归与递推青蛙过河

青蛙过河

2022-01-19:青蛙过河。 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。 给你石子的位置列

求教noip2005青蛙过河