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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM