熄燈問題 列舉

2021-07-27 20:29:59 字數 2025 閱讀 9841

1 問題描述

有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共

5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位置

(上邊、下邊、左邊、右邊

)的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅;如果燈原來是熄滅的,則會被點亮。在矩陣角上的按鈕改變

3盞燈的狀態;在矩陣邊上的按鈕改變

4盞燈的狀態;其他的按鈕改變

5盞燈的狀態。請你寫乙個程式,確定需要按下哪些按鈕,恰好使得所有的燈都熄滅。

2 問題分析

我們可以用對第一行進行列舉的方法,以此確定第一行的狀態,這樣,其餘行也就相應確定了。此外,我們應該注意:

① 第二次按下同乙個按鈕將取消第一次的結果,所以乙個按鈕最多隻需按一次;

② 按鈕按下的順序對結果不會產生影響

我們可以將每一盞燈看做乙個位元,這樣每一行我們可以用6個位元來存,因此,我們只需利用乙個一維的字元陣列就能存下整個矩陣。(乙個元素擁有

8個位元)

這裡,我們通過位運算來操作每乙個字元中的位元。

3 測試樣例

樣例輸入2

0 1 1 0 1 0

1 0 0 1 1 1

0 0 1 0 0 1

1 0 0 1 0 1

0 1 1 1 0 0

0 0 1 0 1 0

1 0 1 0 1 1

0 0 1 0 1 1

1 0 1 1 0 0

0 1 0 1 0 0

樣例輸出:

puzzle #1

1 0 1 0 0 1

1 1 0 1 0 1

0 0 1 0 1 1

1 0 0 1 0 0

0 1 0 0 0 0

puzzle #2

1 0 0 1 1 1

1 1 0 0 0 0

0 0 0 1 0 0

1 1 0 1 0 1

1 0 1 1 0 1 

4 完整**

#include#include#include#includeusing namespace std;

char initlight[5];//原始燈的矩陣

char lights[5];//變化中的燈的矩陣

char result[5];//結果

//對燈的操作實際上就是操作乙個字元中的乙個位元

int getbit(char c, int i)//取字元c的第i個位元

void setbit(char &c, int i, int v)//這樣實參也能改變

void flipbit(char &c, int i)//開關的翻轉

void output(int t, char result)//輸出第t組測試資料的結果

cout << endl;

} } int main()

//列舉第一行所有開關的狀態,用乙個二進位制整型int數從0變到2的n次方-1即可

for(int n = 0; n < 64; n++)

}if(i < 4)

lights[i + 1] ^= switchs;//注意這裡位異或的含義

switchs = lights[i];

}//到這裡我們可以確定前四行的燈都是滅的,所以只需要判斷第五行

if(lights[4] == 0)

} }return 0;

}

5 小結

整個**採用了二進位制數進行列舉,以及列舉了各種位運算的方法,通過確定第一行來隨之確定其餘各行,雖說是列舉,但我們仍然應該將列舉的數量盡量的減少,以減少不必要的時間消耗。

列舉 熄燈問題

有乙個由按鈕組成的矩陣,5行6列,每按一次改變原來顏色 具體事例如下圖所示 請寫乙個程式,判斷需要按哪些按鈕,能夠是燈泡全部熄滅。相關問題細節不再重複 剛剛輸入 2 0 1 1 0 1 0 1 0 0 1 1 1 0 0 1 0 0 1 1 0 0 1 0 1 0 1 1 1 0 0 0 0 1 0...

列舉 熄燈問題

問題描述 有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位置 上邊 下邊 左邊 右邊 的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅 如果燈原來是熄滅的,則會被點亮。在矩陣角上的按鈕改變3盞燈的狀態 在矩陣邊上的按鈕改變4盞燈的狀...

列舉 熄燈問題

include using namespace std intgetbit char c,int i 取c的第i位 void setbit char c,int i,int v 設定c的第i位為v void flip char c,int i 將c的第i位取反 void outputresult i...