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 }
相關文章
相關標籤/搜索