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

2021-08-07 22:56:43 字數 1531 閱讀 7022

總時間限制: 1000ms 記憶體限制: 65536kb

描述 有乙個由按鈕組成的矩陣,其中每行有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

#include

using

namespace

std;

////感覺很難,關鍵是如何想到這麼簡便的方法呢

int pu[8][8],pr[8][8];

bool guess()

}for(int j=1;j<7;j++)

}return

true;

}void enumerate()

while(!guess())

}return;

}int main()

}//列舉第一行

enumerate();

for(int i=1;i<=5;i++)

cout

1813 熄燈問題

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

NOI 1813 熄燈問題

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

C 基礎演算法學習 熄燈問題

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