超级玛丽(陷阱问题)

问题描述:

            现在有一个叫做“超级玛丽”的探险家,他想要从一个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)推这个式子的关键是:首先你想假如剩最后一步了,那么有两种可能,要么一步走两米,要么一步走一米。对啊,就是这样啊,你走的总的步数就等于走两米的步数加走一米的步数嘛,这个问题不就解决了嘛。
大家有啥疑问或者建议请在下方留言哦,我一定会回复的

        注意:此题不是我的原创题目,但题解法是我的原创。仅供个人借鉴参考,不同意商业用途。
--------------------------------------------------------------------------------------------------------------------------------------
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值