标签:space bit style 例子 scan include div namespace 跳过
# 题意
左,右各一个塔,这个塔一旦放上就不能在动,小溪中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\n",jump(n,m));
16 }
17 return 0;
18 }
标签:space bit style 例子 scan include div namespace 跳过
原文地址:https://www.cnblogs.com/hhyx/p/12416650.html