问题描述:
有个叫“超级玛丽”的玩家,他的拿手好戏是跳跃,但他每次只能跳一步或者两步。一次他经
过长为 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);
}