问题描述:
现在有一个叫做“超级玛丽”的探险家,他想要从一个M米长的小道通过,现在小道中有N个陷阱,而探险家一步只能走一米或者两米,现在告诉陷阱的位置,求探险家有多少种走法通过这个小道?
样例输入要求:第一行输入两个数:m,n。分别表示小道长度,陷阱个数。接下来一行输入n个数,表示陷阱的位置。
输出:要求输出一个数,表示通过这个小道的走法种数。
样例01输入: 4 1 2
样例01输出: 1
样例02输入: 8 2 2 5
样例02输出: 2
代码如下:
-------------------------------------------------------------------------------------------
#include <stdio.h>
int f(int m,int n);
int main() {
int m,n;// 输入小道的长度,陷阱的个数
int p,x = 0,s = 1;// p当前陷阱 ,x前一个陷阱
scanf("%d%d",&m,&n);
while(n--){
scanf("%d",&p);
if(p>=m) break;
s *= f(x+1,p-1);
x = p;
}
if(p<m) s *= f(p+1,m);
printf("%d\n",s);
return 0;
}
int f(int m,int n){
if(n-m==0||n-m==1) return 1;
if(n-m==2) return 2;
if(n-m>2) return f(m,n-1)+f(m,n-2);
}
-------------------------------------------------------------------------------------------
此题运用递推法求解最合适,主要是找到最后一个递推式,其他的都很简单。
这个递推式:f(m,n-1)+f(m,n-2)。推这个式子的关键是:首先你想假如剩最后一步了,那么有两种可能,要么一步走两米,要么一步走一米。对啊,就是这样啊,你走的总的步数就等于走两米的步数加走一米的步数嘛,这个问题不就解决了嘛。
大家有啥疑问或者建议请在下方留言哦,我一定会回复的。
注意:此题不是我的原创题目,但题解法是我的原创。仅供个人借鉴参考,不同意商业用途。
--------------------------------------------------------------------------------------------------------------------------------------