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...