不廢話了,直接上題。
1813:熄燈問題
總time limit: 1000ms memory limit: 65536kb
description
有乙個由按鈕組成的矩陣,其中每行有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列的燈。
input
5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。0表示燈的初始狀態是熄滅的,1表示燈的初始狀態是點亮的。
output
5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。其中的1表示需要把對應的按鈕按下,0則表示不需要按對應的按鈕。
sample input
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
sample output
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
有稍稍的用位運算的思路,根據題意先列舉第一行的狀態,然後再推下一行。推到最後一行是再判斷是不是全部都是一種顏色就ok了。
#include
using
namespace std;
int op[6]
[7];
void
change
(int m[6]
[7],
int i,
int j)
if(i+
1<=5)
if(j-
1>=1)
if(j+
1<=6)
}bool
check
(int a[6]
[7])
}return
true;}
void
prt(
int op[6]
[7])
cout<
intmain()
;int m[6]
[7]=
;for
(int i=
1;i<=
5;i++)}
for(
int i=
0;i<<6)
;i++)}
for(
int k=
2;k<=
5;k++)}
}if(check
(a))
}return0;
}
Openjudge 2 1 1813 熄燈問題
輸入 5行組成,每一行包括6個數字 0或1 相鄰兩個數字之間用單個空格隔開。0表示燈的初始狀態是熄滅的,1表示燈的初始狀態是點亮的。輸出5行組成,每一行包括6個數字 0或1 相鄰兩個數字之間用單個空格隔開。其中的1表示需要把對應的按鈕按下,0則表示不需要按對應的按鈕。樣例輸入 0 1 1 0 1 0...
NOI 1813 熄燈問題
題解鏈結 題解 跟poj的1753類似 不過需要將結果儲存下來 這裡的列舉只需要列舉第一行即可,然後每次後面的列舉都需要根據前一行來進行判斷是否需要按燈 注意 按乙個燈會改變周圍的狀態,但是注意此時只按了這乙個燈,周圍只是改變狀態並沒有按燈 每次從第二列開始判斷改變時,注意儲存狀態,每次如果此時的第...
列舉 熄燈問題
有乙個由按鈕組成的矩陣,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...