列舉 熄燈問題

2021-08-15 11:09:45 字數 1256 閱讀 7866

問題描述:

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

請你寫乙個程式,確定需要按下哪些按鈕,恰好使得所有的燈都熄滅。根據上面的規則,我們知道1)第2次按下同乙個按鈕時,將抵消第1次按下時所產生的結果。因此,每個按鈕最多隻需要按下一次;2)各個按鈕被按下的順序對最終的結果沒有影響;3)對第1行中每盞點亮的燈,按下第2行對應的按鈕,就可以熄滅第1行的全部燈。如此重複下去,可以熄滅第1、2、3、4行的全部燈。同樣,按下第1、2、3、4、5列的按鈕,可以熄滅前5列的燈。

解題思路:整體思想時通過列舉所有可能的方式,使得最終熄滅所有的燈,但是必須遵循的原則就是減少列舉數量,針對此題來說,可以只列舉第一行的所有可能情況即可,因為只要第一行的按鍵狀態確定,則隨後幾行的按鍵狀態也就唯一確定,最終只需要判斷最後一行在按鍵作用後是否完全熄滅即可。

**如下:

#include #define h 5

#define w 6

using namespace std;

int light[h+1][w+2];

int button[h+1][w+2];

void read();

bool guess();

void run();

int main()

for(int i = 0; i<8;i++)

read();

run();

return 0;

}bool guess()

} for( i = 1; i<7;i++)

return true;

}void read() }}

void run()

if(guess())

break; }

for( i = 1; i<6;i++)

}

列舉 熄燈問題

有乙個由按鈕組成的矩陣,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...

熄燈問題 列舉

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

列舉 熄燈問題

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