C语言 · 超级玛丽

时间:2023-03-09 07:45:38
C语言  ·  超级玛丽
算法提高 超级玛丽  
时间限制:1.0s   内存限制:256.0MB
问题描述
  大家都知道"超级玛丽"是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步。有一次,他要经过一条长为n的羊肠小道,小道中有m个陷阱,这些陷阱都位于整数位置,分别是a1,a2,....am,陷入其中则必死无疑。显然,如果有两个挨着的陷阱,则玛丽是无论如何也跳过不去的。
  现在给出小道的长度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃方法能到达胜利的彼岸(到达位置n)。
输入格式
  第一行为两个整数n,m
  第二行为m个整数,表示陷阱的位置
输出格式
  一个整数。表示玛丽跳到n的方案数
样例输入
4 1
2
样例输出
1
数据规模和约定
  40>=n>=3,m>=1
  n>m;
  陷阱不会位于1及n上
注释:思路不难,见代码注释。
 /*
思路:
设temp处有陷阱,且temp-1米处的方法数为:b[temp-1],则b[temp+1]=b[temp-1],且到temp+2处的方法数也为b[temp-1],即:b[temp+1]=b[temp-1]=b[temp+2].
综上b[i]=b[i-1]+b[i-2];
由题意知b[1]=b[2]=1;
设有陷阱的i米处的方法数为b[i]=0。
*/
#include<stdio.h>
int main(){
int n,m;
scanf("%d%d",&n,&m);
int b[n], xianjing[m];//b[i]表示到第i米处的方法数
for(int i=;i<=n;i++){//先将b赋初值
b[i]=;
}
int flag=;//标记是否有相邻的陷阱
for(int i=;i<=m;i++){
scanf("%d",&xianjing[i]);
b[xianjing[i]] = ;//有陷阱的位置方法数为0
if(i>)
if(xianjing[i]-xianjing[i-]== || xianjing[i]-xianjing[i-]==-)
flag=;
}
if(flag==)//若有相邻的陷阱,必死无疑
printf("");
else{
for(int i=;i<=n;i++){
if(b[i]==)
continue;
else
b[i]=b[i-]+b[i-];
}
printf("%d",b[n]);
}
return ;
}