描述
有乙個由按鈕組成的矩陣,其中每行有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**12221 1 0 1 0 1
0 0 1 0 1 1
1 0 0 1 0 0
0 1 0 0 0 0
兩種思路:
1): 列舉所有的情況:
如:00000 00000
00000 00000
00000 00000
00000 00000
00000 00001...
乙個乙個的檢驗。這裡有乙個小技巧,考慮每種情況時,一排一排的生成方案並立即檢驗(回溯)
**(wa):
1 #include "2):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
列舉 只第一排的方案 並檢驗,如: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...