2012 藍橋杯 第39級臺階 【初賽試題】
阿新 • • 發佈:2019-02-18
標題: 第39級臺階
小明剛剛看完電影《第39級臺階》,離開電影院的時候,他數了數禮堂前的臺階數,恰好是39級!
站在臺階前,他突然又想著一個問題:
如果我每一步只能邁上1個或2個臺階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級臺階,有多少種不同的上法呢?
請你利用計算機的優勢,幫助小明尋找答案。
要求提交的是一個整數。
注意:不要提交解答過程,或其它的輔助說明文字。
解答:
- publicclass 第39級臺階_04 {
- //可行的方案數量
- staticint num=0;
-
publicstaticvoid
- f(39,"");
- System.out.println(num);
- }
- /**
- * 遞迴求解其中
- * @param n 臺階的級數
- * @param s 上臺階的方案
- */
- staticvoid f(int n,String s){
- if(n<0){ //不符合臺階的總級數,不和題意
- return;
- }
-
if(n==0){ //當n=0時,剛好走完了所有的臺階
- if(s.length()%2==0) //當走完所有臺階的步數是偶數時
- num++; //方案數量加1
- return;
- }
- /**
- * 當臺階還沒有走完時,繼續走下去
- * 每一步可以走一個臺階或者是兩個臺階
- */
- for(int i=1;i<3;i++){
- f(n-i,s+i);
- }
- }
- }
或者利用排列組合思想解答:
# 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,其中大部分位個人觀點)