【Hanoi变形】 青蛙过河

传送门

题意

左岸右右岸各一个Hanoi,开始所有青蛙在左岸塔\(L\)上,青蛙一旦跳出这个塔后就不能再回来,青蛙跳上右岸的塔就不能再移动,小溪中\(n\)个塔,\(m\)片叶,塔可以摞任意数量其中其中青蛙的编号满足汉诺塔,叶子只能同一时间只能存在一只青蛙,求最多可以跳过多少只青蛙

数据范围

\(1\leq n \leq 10\)
\(1\leq m \leq 10\)

题解

  • 首先考虑没有石柱的情况,即\(n=0\)

    • \(m=0\)时,只能跳过一只青蛙,由\(L\)直接跳到\(R\)

    • \(m=1\)时,可以跳过两只青蛙。

      • 过程为:青蛙1从\(L\)跳到荷叶上,青蛙2从\(L\)直接跳到\(R\),最后青蛙1从荷叶跳到\(R\)
    • \(m=2\)时,可以跳过3只青蛙。过程为:青蛙1从\(L\)跳到荷叶1,青蛙2从\(L\)跳到荷叶2,青蛙3从\(L\)跳到R,青蛙2从荷叶2跳到\(R\),青蛙1从荷叶1跳到\(R\)

    • 得出结论:只考虑荷叶时,每增加一片荷叶,跳过的青蛙数加一,即青蛙数为\(m+1\)

  • 有石柱的情况

    • \(n=1,m=0\)时,可以跳过两只青蛙。过程为:青蛙1从\(L\)跳到石柱上,青蛙2从\(L\)跳到\(R\),青蛙1从石柱跳到\(R\)

    • \(n=1,m=1\)时,可以跳过4只青蛙。过程为:

      • 步骤1:青蛙1和青蛙2借助荷叶跳到石柱上;

      • 步骤2:青蛙3和青蛙4借助荷叶跳到\(R\)

      • 步骤3:青蛙1和青蛙2借助荷叶由石柱跳到\(R\)

    • \(n=1,m\)为任意值时,可以跳过\(2 \times (m+1)\)只青蛙

      • 步骤1:前\(m+1\)只青蛙借助荷叶跳到石柱上;

      • 步骤2:后\(m+1\)只青蛙借助荷叶跳到\(R\)

      • 步骤3:前\(m+1\)只青蛙借助荷叶由石柱跳到\(R\)

    • \(n=2,m\)为任意值时,可以跳过\(4 \times (m+1)\)只青蛙。显然当\(n=1\)时,\(m\)为相同值时可以跳过\(2 \times (m+1)\)只青蛙。那么这个过程可以理解为:

      • 步骤1:前\(2 \times (m+1)\)只青蛙利用荷叶和其中一个石柱(这里设为\(S_{1}\))从L跳到另外一根石柱(\(S_{2}\))上;

      • 步骤2:后\(2 \times (m+1)\)只青蛙借助荷叶和\(S_{1}\)\(L\)跳到\(R\)

      • 步骤3:前\(2 \times (m+1)\)只青蛙从\(S_{2}\)借助荷叶和\(S_{1}\)跳到\(R\)

  • 结论:\(n\)个石柱的移动次数是\(n-1\)个石柱移动次数的两倍,\(t=2\times jump(n-1,m)\)

Code

#include<bits/stdc++.h>
using namespace std;
int jump(int n,int m)
{
    int t;
    if(n==0)
        t=m+1;
    else {
        t=2*jump(n-1,m);
    }
    return t;
}
int _;
int n,m;

void solve()
{
    cin>>n>>m;
    cout<<jump(n,m)<<endl;
}
int main(){
    cin>>_;
    while(_--) solve();
    return 0;
}
posted @ 2020-05-26 20:39  Hyx'  阅读(257)  评论(0)    收藏  举报