POJ2811熄燈問題

2021-08-27 04:08:57 字數 1054 閱讀 9444

題目描述

事實上,只用列舉第一行或者第一列按鈕的狀態即可。下面以列舉第一行按鈕的狀態為例。因為第一行燈的狀態由第一行和第二行的按鈕決定,所以第一行按鈕的狀態確定之後,為是第一行的燈全部熄滅,第二行按鈕的狀態也就唯一確定了。例如,當第一行按鈕的狀態確定之後:

因此,在第一行按鈕的狀態確定之後,第二行按鈕的狀態也就確定了。同理,當第一行和第二行按鈕的狀態確定之後,第三行按鈕的狀態也就確定了。因此,程式只需在列舉第一行按鈕的狀態之後,再依次確定剩餘各行按鈕的狀態,並判斷最後一行的燈是否全部熄滅即可。這樣,需要列舉的狀態數就變為2^6=64.

具體在求解乙個按鈕的狀態時,根據乙個燈被開關兩次相當於抵消這一前提,可以用異或的方式實現:第i行第j列按鈕的狀態ans(i,j),由初始的(i-1,j)位置燈的初始狀態block(i-1,j)等周圍的按鈕的狀態決定,即:

ans(i,j)=block(i-1,j)^ans(i-1,j)^ans(i-1,j-1)^ans(i-1,j+1)^ans(i-2,j),程式設計實現時,還要注意邊界按鈕的處理。

#includeusing namespace std;

int n;

int block[7][8],ans[7][8];

//判斷當前解是否可行

bool check_ans()

for(int j=1;j<=6;j++) //檢查最後一行是否全部關閉

if(ans[6][j]==1) return false;

return true;

} void solve()

if(check_ans()) break; //檢查該方案是否可以關掉全部的燈

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

int main()

POJ 2811 熄燈問題 列舉

總時間限制 1000ms 記憶體限制 65536kb 描述 有乙個由按鈕組成的矩陣,其中每行有6個按鈕,共5行。每個按鈕的位置上有一盞燈。當按下乙個按鈕後,該按鈕以及周圍位置 上邊 下邊 左邊 右邊 的燈都會改變一次。即,如果燈原來是點亮的,就會被熄滅 如果燈原來是熄滅的,則會被點亮。在矩陣角上的按...

POJ 2811 熄燈問題 POJ 1222

樣例輸入 輸出後面有 區域性即整體思想 雖然整體情況看起來巨多,眼花繚亂,但有時候問題的一小部分,其實對應了所有的結果,因為所有的結果都是從這一區域性出發生長出來的 雞湯 細節決定成敗,丟了馬蹄鐵導致戰爭失敗 本題 第一行就是這樣的 區域性 任意給出乙個第一行的按開關方案,後面所有行,要想成功,一定...

2811 熄燈問題(列舉)

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