算法提高 超級瑪麗
時間限制: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 }