題目:
有乙個由按鈕組成的矩陣,其中每行有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列的燈。
輸入第一行是乙個正整數n,表示需要解決的案例數。每個案例由5行組成,每一行包括6個數字。這些數字以空格隔開,可以是0或1。0表示燈的初始狀態是熄滅的,1表示燈的初始狀態是點亮的。
輸出對每個案例,首先輸出一行,輸出字串「puzzle #m」,其中m是該案例的序號。接著按照該案例的輸入格式輸出5行,其中的1表示需要把對應的按鈕按下,0則表示不需要按對應的按鈕。每個數字以乙個空格隔開。
樣例輸入
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 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 #1
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
puzzle #2
1 0 0 1 1 1
1 1 0 0 0 0
0 0 0 1 0 0
1 1 0 1 0 1
1 0 1 1 0 1
**:
#include #include using namespace std;
bool puzzle[ 6 ][ 7 ], press[ 6 ][ 7 ], res[ 6 ][ 7 ];
void change( int i,int j )
bool presssuccessfully()
for( int i = 2; i <=5; i++ )
}for( int i = 1; i <= 6; i++ )
if( press[ 5 ][ i ] == 1 )
return true;
}int selectpress( int num )
cout << endl;
}return 0;
}else}}
return 0;
}int main()
selectpress( num++ );
n--;
}return 0;
}
思想:
該問題用的是列舉法,我們知道第一排的燈泡可以由第二排的全部熄滅,第二排的可以由第3排的全部熄滅。。然後第5排可以全部熄滅第4排的。那麼 最後會剩下第5行的無法進行處理。這個時候就需要列舉思想,想象一下,第一排是什麼情況才會使得,進行到最後恰好第5排全部熄滅,第1排所有的情況次數是2^6次,對於這部分搜尋空間。我們需要做的就是一一枚舉。
POJ 2811 熄燈問題 列舉
總時間限制 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...
熄燈問題 列舉
1 問題描述 有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共 5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位置 上邊 下邊 左邊 右邊 的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅 如果燈原來是熄滅的,則會被點亮。在矩陣角上的按鈕改變 3盞燈的狀態 在矩陣邊上的按鈕改變 ...