列舉2 熄燈問題

2021-09-07 11:44:41 字數 2789 閱讀 9526

因為互相關聯性,從列舉所有層到只列舉第一層

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

每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位置(上邊、下邊、左邊、右邊)的燈都會改變一次。

即,如果燈原來是點亮的,就會被熄滅;如果燈原來是熄滅的,則會被點亮。

在矩陣角上的按鈕改變3盞燈的狀態;在矩陣邊上的按鈕改變4盞燈的狀態;其他的按鈕改變5盞燈的狀態。

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

輸入:每個案例由5行組成,每一行包括6個數字。

這些數字以空格隔開,可以是0或1。0表示燈的初始狀態是熄滅的,1表示燈的初始狀態是點亮的。

樣例輸入:

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 #m」,其中m是該案例的序號。

接著按照該案例的輸入格式輸出5行,其中的1表示需要把對應的按鈕按下,0則表示不需要按對應的按鈕。

每個數字以乙個空格隔開。

樣例輸出:

燈泡陣這裡用6行8列是保證按規定按鈕影響的都是周圍5盞燈的情況,注意,不是7行8列,因為最後一行不會被下一行影響

1/*2

分析:3

方法一:列舉所有可能

4總共5*6=30展燈,所有可能情況為2^30,所以肯定不行

5方法二:如果區域性狀態確定,那麼其餘狀態也被確定,那麼我們只用例舉區域性狀態即可

6當第一行的燈光操作之後,我們可以操作第二行的燈光將第一行的燈光全部熄滅,而此時第二行的燈光也是唯一確定的。

7而第三,第四等行影響不到第一行。同理第二行的燈光確定後,第三行把第二行全部調熄,那麼第三行也是唯一確定的。

8同理第四行,第五行也是唯一確定的。

9所以當確定第一行之後,所有的行都是唯一確定的,我們看這個所有燈的唯一確定的情況是否使所有的燈熄滅從而判斷解是否為可行解。

10其實我們只要判斷第五行即可,因為照之前的規則,前四行肯定是熄燈的。

11所以我們只用列舉第一行就可以列舉所有的情況。

12情況總數為:2^6,每種情況都要調所有的30盞燈,執行次數為2^6*5*6(下面的**程式設計我們選這種)

1314

優化:15

若是把列看成行,情況總數為2^5,執行次數為2^5*6*5

1617

18執行2^6的時候,我們可以用6層迴圈,我們也可以用數字的二進位制來表示。我們選擇用數字的二進位制來表示。

1920

2122

*/23

2425 #include 26

using

namespace

std;

27int puzzle[6][8],press[6][8];//

這裡用6行8列是保證按規定按鈕影響的都是周圍5盞燈的情況,注意,不是7行8列,因為最後一行不會被下一行影響

2829

bool guess()37}

38for(c=1;c<7;c++)

45return (true

); 46}47

48void enumerate()

54/*

55press[1][1]:1 c:1 press[1][c]=press[1][1]>1不成立 1 0 0 0 0 0 表示的是第一盞燈開,其餘5盞燈熄

56press[1][1]:2 c:1 press[1][c]=press[1][1]>1成立 press[1][c]=press[1][1]:0 c++:2 press[1][c]=press[1][2]:1

57press[1][c]=press[1][2]>1不成立 0 1 0 0 0 0 表示的是第二盞燈開,其餘5盞燈熄

58press[1][1]:3 c:1 press[1][c]=press[1][1]>1成立 press[1][c]=press[1][1]:0 c++:2 press[1][c]=press[1][2]:2

59press[1][c]=press[1][2]>1成立 press[1][c]=press[1][2]:0 c++:3 press[1][c]=press[1][3]:1

600 0 1 0 0 0 表示的是第三盞燈開,其餘5盞燈熄

61以此類推

6263

*/64

while(guess()==false)72

}73return;74

}7576int

main()

86//

錄入資料,燈泡的初始狀態

87for(r=1;r<6;r++)91}

9293 enumerate();//

進行列舉判定

94 printf("

puzzle #1\n");

95//

輸出結果

96for(r=1;r<6;r++)

100 printf("\n"

);101

}102

return0;

103 }

列舉 熄燈問題

有乙個由按鈕組成的矩陣,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盞燈的狀態 在矩陣邊上的按鈕改變 ...

列舉 熄燈問題

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