1. 程式人生 > >2012 藍橋杯 第39級臺階 【初賽試題】

2012 藍橋杯 第39級臺階 【初賽試題】

標題: 第39級臺階

    小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!

    站在臺階前,他突然又想著一個問題:

    如果我每一步只能邁上1個或2個臺階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級臺階,有多少種不同的上法呢?

    請你利用計算機的優勢,幫助小明尋找答案。

要求提交的是一個整數。
注意:不要提交解答過程,或其它的輔助說明文字。

解答:

  1. publicclass 第39級臺階_04 {  
  2.     //可行的方案數量
  3.     staticint num=0;  
  4.     publicstaticvoid
     main(String[] args) {  
  5.         f(39,"");  
  6.         System.out.println(num);  
  7.     }  
  8.     /** 
  9.      * 遞迴求解其中 
  10.      * @param n 臺階的級數 
  11.      * @param s 上臺階的方案 
  12.      */
  13.     staticvoid f(int n,String s){  
  14.         if(n<0){   //不符合臺階的總級數,不和題意
  15.             return;  
  16.         }
  17.         if(n==0){  //當n=0時,剛好走完了所有的臺階
  18.             if(s.length()%2==0)  //當走完所有臺階的步數是偶數時
  19.                 num++;  //方案數量加1
  20.             return;  
  21.         }  
  22.         /** 
  23.          * 當臺階還沒有走完時,繼續走下去 
  24.          * 每一步可以走一個臺階或者是兩個臺階 
  25.          */
  26.         for(int i=1;i<3;i++){  
  27.             f(n-i,s+i);  
  28.         }  
  29.     }  
  30. }

或者利用排列組合思想解答:

 # include <stdio.h>  
 int c(int m, int n)  
{  
     int cmn = 1;  
     for(int i = 0; i < n; i++) {  
         cmn = cmn * (m - i) / (i + 1);  
     }  
     return cmn;  
 }  
 int main(void)  
 {  
     int n = 0;  
     for(int i = 1; i <= 19; i += 2) {  
         n += c(39 - i, i);  
    }  
    printf("%d\n", n);  
     return 0;  
}  
 

還可以這樣做:

當我們稍微寫出幾次臺階的走法 我們會發現 當走第n階的時候  總是 n-1   和   n-2的走法的 和,這樣 我們不難看確實是這樣的結果

可以退出f(n) = f(n-1)+f(n-2)很簡單的一個遞迴思想

(部分內容轉載自:http://blog.csdn.net/lzj_jie/article/details/9199955?reload,其中大部分位個人觀點)