【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;
}

浙公网安备 33010602011771号