1. 程式人生 > 實用技巧 >第九屆藍橋杯國賽c++B組第二題

第九屆藍橋杯國賽c++B組第二題

今天早起沒事幹,因為自己省賽的時候的垃圾狀態沒能打入決賽很不甘心,就隨便點開了一道國賽真題看了看,發現確實不難。

2.鐳射樣式
問題描述
x星球的盛大節日為增加氣氛,用30臺機光器一字排開,向太空中打出光柱。
安裝除錯的時候才發現,不知什麼原因,相鄰的兩臺鐳射器不能同時開啟!
國王很想知道,在目前這種bug存在的情況下,一共能打出多少種鐳射效果?
顯然,如果只有3臺機器,一共可以成5種樣式,即:
全都關上(sorry, 此時無聲勝有聲,這也算一種)
開一臺,共3種
開兩臺,只1種
30臺就不好算了,國王只好請你幫忙了。
要求提交一個整數,表示30臺鐳射器能形成的樣式種數。
注意,只提交一個整數,不要填寫任何多餘的內容。
答案:2178309

方法一:
思路:用dfs來做。
1.每一個燈都有兩條路可走,開啟或者不開啟。
2.當一個燈不開啟的時候直接往下走就可以了。
3.當一個燈開啟的時候,前提是:它前面的燈不開啟。(因為我們每次計算都是看的前面的燈,所以就保證了所有相鄰的燈不同時開啟,每個燈都會和它前面的燈比較。)

弄好思路之後就可以寫程式碼啦~
一道dfs模板題~

#include<bits/stdc++.h>

using namespace std;

const int N = 40;
int st[N];

long long ans;

void dfs(int x){
    if(x > 30){
        ans ++;
        return ;
    }
    dfs(x + 1);  //x不開啟
    if(!st[x - 1]){
        st[x] = 1; //x開啟
        dfs(x + 1);
        st[x] = 0;
    }
}

int main(){
    dfs(1);
    
    printf("%d",ans);
    
    return 0;
}

方法二:
通過觀察發現一個燈2,兩個燈3,三個燈5,符合斐波那契數列規律。
因此用斐波那契數列來做。

#include<bits/stdc++.h>

using namespace std;

const int N = 40;
int st[N];

long long f[3];


int main(){
    f[1] = 2;
    f[2] = 3;
    for(int i = 2 ; i < 30 ; i ++){
       f[0] = f[1];
       f[1] = f[2];
       f[2] = f[0] + f[1];
    }
    cout << f[2];
    return 0;
}