找规律:
将此问题分为两大块:当河中石柱(x)为0时,通过的青蛙数目仅与当前荷叶数目(y)有关:num_frog = y + 1
当存在河中石柱时,可以把青蛙跳过的过程等价为一下过程:
分为红色的和绿色的部分,将其中一个河中石柱看做是右石柱,然后借用其他的荷叶和石柱将青蛙尽可能多的转移到该石柱上,然后再把除去本石柱的其他石柱和荷叶跟真右石柱看做一个整体,进行转移,两个过程的石柱和荷叶类型一模一样,所以两次分别转移的青蛙数目是一样的,最后再利用石柱和荷叶将河中石柱的青蛙转移到右石柱上,注:由于这里的转移过程和第一步的转移过程中的石柱和荷叶数目完全一样,所以在这里石柱上的青蛙一定能全部的转移到右石柱上。
例如::
河中分别有一个石柱和一个荷叶的情况,第一种转移方式的系统如上图所示,在这个新系统里,转移的工具只有一个荷叶
第二次转移过程如图所示,该系统内只有一个荷叶作为转移的工具,所以两次的转移的青蛙数目是一样的。
最后还要将河中石柱的青蛙转移到右岸上
要转移的系统的条件是和之前一模一样的,所以河中石柱的青蛙一定能全部转移到右岸上
所以转移的方程为:2 * cross_river(x - 1, y)
代码:
#include<stdio.h>
int cross_river(int x, int y){
if (x == 0) return y + 1;
else return 2 * cross_river(x - 1, y);
}
int main(){
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", cross_river(x, y));
}
本题目的递归思路:每次的转移方案都能用少一个石柱且荷叶数目相同的情况求出来,并且当石柱的数目为0时过河青蛙数目只与荷叶数目有关,以石柱数目为0的情况作为结束递归的条件。通过每一次倒退到求少一个石柱的情况的过河青蛙数目,最终得到结果。