藍橋杯 開關問題

2022-06-28 19:12:11 字數 1700 閱讀 6769

目錄藍橋杯的開關問題一般都是偏暴力的做法,可能會涉及使用位運算進行狀態壓縮。

acwing 1208 翻硬幣

初態和終態,每個狀態一行

開關連鎖反應:只能同時按下兩個開關

很簡單,從第二個開關開始列舉,如果前乙個開關和終態對應位置開關不一樣,那麼該開關需要按下以改變前乙個開關的狀態使得前乙個開關狀態和終態一致。

#include #include using namespace std;

int a[105],b[105];

int m,n;

char c;

int main()

while((c=getchar())!='\n')

int res=0;

for(int i=1;iacwing 95 費解的開關

給定初態,問最少需要幾步使所有燈變亮。

題解:假定某一行的開關狀態確定了,該行某個開關狀態只會被下一行該位置的正下方的開關改變。

所以我們可以一行一行考慮,只要固定了該行,那麼該行下面的所有行的開關,都是為了彌補上一行沒有閉合的開關而服務(如果某個位置正上方的開關為0,那麼這個位置一定要按下,為了使得其正上方的開關變成1,)。

因此我們可以列舉第一行每個開關是否按下(使用二進位制列舉,1010表示按下第一和第三個開關),只要第一行開關確定了,下面所有開關都確定了,對於第一行的每種按法,最後遍歷一下是否所有開關是否都是亮的,如果不是說明該方案不合法。

#include #include #include using namespace std;

#define sf(x) scanf("%d",&(x))

int a[10][10],b[10][10];

int n,cnt,ans;

inline void check()

else if(cnt>=6&&!b[i-1][j])

} }for(int i=0;i<5;++i)if(b[4][i]==0)isok=false;

//cout<<"cnt"<>j)&1)

//cout<<"i:"<6)printf("%d\n",-1);

else printf("%d\n",ans);

} return 0;

}

acwing 116 飛行員兄弟

給定初態4 * 4,問最少需要幾步使所有燈變亮。

題解:只有16個格仔,可將將每個格仔編號,變成乙個16個bit位的數,記為s。二進位制列舉列舉16個格仔是否按下,按下每個格仔會改變該行該列格仔的狀態。可以先預處理出按下每個格仔會改變的哪些編號的格仔,根據格仔的編號組成乙個16bit位的數,s異或上這個數,就相當於改變了該行該列的狀態。

#include using namespace std;

const int inf=0x3f3f3f3f;

int a[6][6];

char c;

int change[6][6];

int q;

inline int getp(int &x,int &y)

inline void getchange(int &x,int &y)

} if(!t)

return 0;

}

藍橋杯 試題 歷屆試題 翻硬幣 反轉 開關問題

問題描述 小明正在玩乙個 翻硬幣 的遊戲。桌上放著排成一排的若干硬幣。我們用 表示正面,用 o 表示反面 是小寫字母,不是零 比如,可能情形是 oo oooo 如果同時翻轉左邊的兩個硬幣,則變為 oooo oooo 現在小明的問題是 如果已知了初始狀態和要達到的目標狀態,每次只能同時翻轉相鄰的兩個硬...

藍橋杯 正則問題

題目描述 考慮一種簡單的正規表示式 只由 x 組成的正規表示式。小明想求出這個正規表示式能接受的最長字串的長度。例如 xx x x xx xx 能接受的最長字串是 長度是6 輸入 xx x x xx xx 程式應該輸出 6 思路 遇到 就遞迴呼叫函式,遇到 a 就將計數器x 遇到 就選出左右最大值,...

藍橋杯 日期問題

問題描述 小明正在整理一批歷史文獻。這些歷史文獻中出現了很多日期。小明知道這些日期都在1960年1月1日至2059年12月31日。令小明頭疼的是,這些日期採用的格式非常不統一,有採用年 月 日的,有採用月 日 年的,還有採用日 月 年的。更加麻煩的是,年份也都省略了前兩位,使得文獻上的乙個日期,存在...