1813 熄燈問題

2021-07-30 15:55:24 字數 3114 閱讀 8408

描述

有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以

及周圍位置(上邊、下邊、左邊、右邊)的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅;如果燈原來是熄

滅的,則會被點亮。在矩陣角上的按鈕改變3盞燈的狀態;在矩陣邊上的按鈕改變4盞燈的狀態;其他的按鈕改變5盞燈

的狀態。

在上圖中,左邊矩陣中用x標記的按鈕表示被按下,右邊的矩陣表示燈狀態的改變。對矩陣中的每盞燈設定乙個初始狀

態。請你按按鈕,直至每一盞等都熄滅。與一盞燈毗鄰的多個按鈕被按下時,乙個操作會抵消另一次操作的結果。在下

圖中,第2行第3、5列的按鈕都被按下,因此第2行、第4列的燈的狀態就不改變。

哪些按鈕,恰好使得所有的燈都熄滅。根據上面的規則,我們知道1)第2次按下同乙個按鈕時,將抵消第1次按下時

所產生的結果。因此,每個按鈕最多隻需要按下一次;2)各個按鈕被按下的順序對最終的結果沒有影響;3)對第1行

中每盞點亮的燈,按下第2行對應的按鈕,就可以熄滅第1行的全部燈。如此重複下去,可以熄滅第1、2、3、4行的

全部燈。同樣,按下第1、2、3、4、5列的按鈕,可以熄滅前5列的燈。

輸入5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。0表示燈的初始狀態是熄滅的,1表

示燈的初始狀態是點亮的。

輸出5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。其中的1表示需要把對應的按鈕按下,

0則表示不需要按對應的按鈕。

樣例輸入

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

樣例輸出

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

**1222

兩種思路:

1):  列舉所有的情況:

如:00000 00000

00000 00000

00000 00000

00000 00000

00000 00001...

乙個乙個的檢驗。這裡有乙個小技巧,考慮每種情況時,一排一排的生成方案並立即檢驗(回溯)

**(wa):

1 #include "

stdafx.h

"2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;

8int

set[20][10], temp[20][10], fub[20][10], way[20][10];9

void

print()

1017}18

void copy(int k,bool

r)19

26else

27for (int i = k; i <= k + 2; i++)

28for (int j = 1; j <= 6; j++)

2932}33

void change(int

i)3445}

46}47bool test(int

i)48

54int fu(int i, int

j)55

60if (i >= 2 && j == 1)61

71}72if (i == 6 && test(5) == 1)73

77}78if (i <= 5)79

for (int k = 0; k <= 1; k++)

8084

return0;

85}86int

main()

87

2):

列舉 只第一排的方案 並檢驗,如:0 0 0 0 0 (方案)   0 1 0 1 0(狀態)

==>   0 1 0 1 0

生成下一排方案:    0 1 0 1 0

原理是:第i排第j個登是亮的 則第i+1排第j個登是1,否則是0

最後檢驗第5排 是否全是0;

**如下(ac):

1 #include "

stdafx.h

"2 #include3 #include4 #include5 #include6 #include7

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

using

namespace

std;

9void doit(int

i)1020}

21void

clean()

2228}29

bool check(int

i)30

39return1;

40}41doit(i);

42for (int j = 1; j <= 6; j++)

4347

return check(i + 1

);48}49

intmain()

5057

for (w[1][1] = 0; w[1][1]<= 1; w[1][1]++)

58for (w[1][2] = 0; w[1][2] <= 1; w[1][2]++)

59for (w[1][3] = 0; w[1][3] <= 1; w[1][3]++)

60for (w[1][4] = 0; w[1][4] <= 1; w[1][4]++)

61for (w[1][5] = 0; w[1][5] <= 1; w[1][5]++)

62for (w[1][6] = 0; w[1][6] <= 1; w[1][6]++)

6372

return0;

73}74}

75 }

NOI 1813 熄燈問題

題解鏈結 題解 跟poj的1753類似 不過需要將結果儲存下來 這裡的列舉只需要列舉第一行即可,然後每次後面的列舉都需要根據前一行來進行判斷是否需要按燈 注意 按乙個燈會改變周圍的狀態,但是注意此時只按了這乙個燈,周圍只是改變狀態並沒有按燈 每次從第二列開始判斷改變時,注意儲存狀態,每次如果此時的第...

1813 熄燈問題(2 1基本演算法之列舉)

總時間限制 1000ms 記憶體限制 65536kb 描述 有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共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...