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上
 
注释:思路不难,见代码注释。
 1 /*
 2 思路:
 3     设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].
 4 综上b[i]=b[i-1]+b[i-2];
 5     由题意知b[1]=b[2]=1;
 6     设有陷阱的i米处的方法数为b[i]=0。 
 7 */
 8 #include<stdio.h> 
 9 int main(){
10     int n,m;
11     scanf("%d%d",&n,&m);
12     int b[n], xianjing[m];//b[i]表示到第i米处的方法数
13     for(int i=0;i<=n;i++){//先将b赋初值
14         b[i]=1;
15     }
16     int flag=0;//标记是否有相邻的陷阱 
17     for(int i=1;i<=m;i++){
18         scanf("%d",&xianjing[i]);
19         b[xianjing[i]] = 0;//有陷阱的位置方法数为0
20         if(i>1)
21             if(xianjing[i]-xianjing[i-1]==1 || xianjing[i]-xianjing[i-1]==-1)
22                 flag=1;
23     }
24     if(flag==1)//若有相邻的陷阱,必死无疑 
25         printf("0");
26     else{
27         for(int i=3;i<=n;i++){
28             if(b[i]==0)
29                 continue;
30             else
31                 b[i]=b[i-1]+b[i-2];
32         }
33         printf("%d",b[n]);
34     }
35     return 0;
36 }
原文地址:https://www.cnblogs.com/panweiwei/p/6667167.html