藍橋杯-試題 算法訓練 瓷磚鋪放-c++遞歸

瓷磚鋪放

題目
資源限制時間限制:1.0s 內存限制:512.0MB
問題描述  
有一長度爲N(1<=N<=10)的地板,給定兩種不同瓷磚:一種長度爲1,另一種長度爲2,數目不限。要將這個長度爲N的地板鋪滿,一共有多少種不同的鋪法?

例如,長度爲4的地面一共有如下5種鋪法:
  4=1+1+1+1
  4=2+1+1
  4=1+2+1
  4=1+1+2
  4=2+2
  

編程用遞歸的方法求解上述問題。輸入格式,只有一個數N,代表地板的長度輸出格式。輸出一個數,代表所有不同的瓷磚鋪放方法的總數

思路:

一開始,我想在遞歸裏用一個for循環來取1和2,但是最後沒寫出來。後來又讀了一遍題目,發現這題只是讓你輸出最後的種數,並沒有輸出每種方法的組合,於是只需要對遞歸的出口和遞歸的1和2分別順序執行即可,採用正序遞歸,從0開始。

c++代碼:

//藍橋杯-瓷磚鋪路-2020/04/20
#include<iostream>
using namespace std;
int n;//瓷磚的長度
int ret = 0;//統計方案數
//遞歸
void dfs(int t){
   //如果當前層大於n,則退出
   if (t > n)
    return;
   //當前層等於n,計數
   if (t == n){
    ret++;
    return;
   }
   //遞歸+1的
   dfs(t + 1);
   //遞歸+2的
   dfs(t + 2);
}
int main()
{
   cin >> n;
   //從0開始遞歸
   dfs(0);
   cout << ret << endl;
   return 0;
}

由於博主一開始用for循環來取1和2,沒寫出來。參考了網上的代碼,發現自己菜的扣jio。希望此文對大家認識遞歸有所幫助吧!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章