首页 > 代码库 > C语言 · 超级玛丽
C语言 · 超级玛丽
算法提高 超级玛丽
时间限制:1.0s 内存限制:256.0MB
问题描述
大家都知道"超级玛丽"是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步。有一次,他要经过一条长为n的羊肠小道,小道中有m个陷阱,这些陷阱都位于整数位置,分别是a1,a2,....am,陷入其中则必死无疑。显然,如果有两个挨着的陷阱,则玛丽是无论如何也跳过不去的。
现在给出小道的长度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃方法能到达胜利的彼岸(到达位置n)。
现在给出小道的长度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃方法能到达胜利的彼岸(到达位置n)。
输入格式
第一行为两个整数n,m
第二行为m个整数,表示陷阱的位置
第二行为m个整数,表示陷阱的位置
输出格式
一个整数。表示玛丽跳到n的方案数
样例输入
4 1
2
2
样例输出
1
数据规模和约定
40>=n>=3,m>=1
n>m;
陷阱不会位于1及n上
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 }
C语言 · 超级玛丽
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。