超级玛丽——(陷阱问题) 蓝桥杯

问题描述:

                有个叫“超级玛丽”的玩家,他的拿手好戏是跳跃,但他每次只能跳一步或者两步。一次他经

                过长为 n 的羊肠小道,小道中有 m 个陷阱,陷入其中必死无疑,如果有两个挨着的也跳不过

                去。现在给出小道长度 n ,陷阱个数及位置,超级玛丽从位置 1 开始到达 n ,有多少种方法

                能通过小道?

输入格式:

                第一行表示小道长 n (3<=n<=40),陷阱个数 m (m>=1)  (n>m)。

                第二行有 m 个整数,表示陷阱的位置。

输出格式:

                一个整数表示通过的方案数。

样例输入:   4 1    2

样例输出:  1

源代码:

#include <stdio.h>
int XJ(int m, int n);

int main(){
    int n, m, i;
    long s = 1,x = 0, p;
    scanf("%d%d",&n,&m);
    for (i=0;i<m;i++){
        scanf("%d",&p);//  p 代表当前陷阱
        if (p<n) s *= XJ(x+1,p-1);
        x = p;//   x 存储上个陷阱的位置
    }
    if (p<n) s *= XJ(p+1,n-1);
    printf("%ld\n",s);
    return 0;
}

//   求陷阱m与陷阱n之间有多少种走法
int XJ(int m, int n){
    if(m==n||m-n==1) return 1;
    if(m-n==2) return 2;
    return XJ(m,n-1) + XJ(m,n-2);
}

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值