poj1222 熄燈問題 列舉(二進位制)

2021-10-07 16:46:50 字數 1637 閱讀 2125

題目大意:

有5×6的乙個方格,裡頭有幾個電燈泡子,你給乙個電燈泡子關了或者開了,它上下左右的電燈泡子都會變到相反狀態(包括自己),現在問了,按哪幾個開關能讓電燈泡子全部關閉,對就是這個意思,輸出你所按得開關的矩陣,就完事了。

思路:

那麼廢話少說,讓我們直插主題,怎麼做,首先映入眼簾的想法就是把所有情況都列舉,但是這包括了2的30次方(二進位制算的)種可能,一看就不行,那麼我們用其他方法,遇到這種問題一定要研究區域性,假如第一行按完了,第一行還有幾個燈沒有關,那麼如何關掉這幾個燈(第一行按完了,不按了),唯一的方法就是按第一行沒關燈位置的下面,就是第二行對應的幾個位置,我們第二行按完了(用來關第一行),也可能剩下幾個燈沒關(第二行),依次類推,我們去按第三行,最終如果最後一行能夠關閉,說明你在第一行關的那幾個燈是沒毛病的,因為二三四行的套路是隨第一行你怎麼關而決定的,所以我們只需要列舉第一行(從000000->000001->000010…->111111)列舉第一行就可以理解成二進位制由1到64,把第一行當做二進位制,那麼如何判斷是否全部關閉嘞,第二行能滅了第一行,第三行能滅了第二行,那麼如果最後一行都滅了,就代表全滅了,所以我們只需要判斷最後一行滅沒滅。

思路是這麼個思路,上**:

//poj1222

#include

#include

#include

#include

using

namespace std;

int num;

int light[7]

[8],tem[7]

[8];

//light是原始的電燈泡子,tem是它的複製品

int pus[7]

[8];

void

press

(int x,

int y)

//模擬按按鈕的過程

bool

check()

//檢查最後一行

return

true;}

intmain()

}memset

(pus,0,

sizeof

(pus));

//pus是記錄你按哪個了。我們列舉pus的第一行,先給初始化為0

int count =0;

while

(count <64)

//由000000->111111二進位制對第一行列舉

}for

(int i =

1; i <=

6; i++

)//按第一行

for(

int x =

2; x <=

5; x++

)//按2-5行,按我說的去按,上面哪個亮,我就按他對應下面的 }}

if(check()

)//成功了就輸出

cout<}break;}

else

//沒成功給尾數加1,繼續列舉

} pus[1]

[6]++

; count++;}

}}return0;

}

哦了。

POJ1222熄燈問題

問題描述 程式 思路1 列舉所有可能的開關狀態,對每個狀態計算下最後燈的情況,看是否都熄滅 每種按鈕有兩種狀態,一共有30個開關,那麼狀態數是2的30次方,太多不可取 思路2 如何減少列舉的數目呢?如果存在某個區域性,一旦這個區域性狀態被確定後,那麼剩餘其他部分的狀態只能 是確定的一種或者不多的n種...

POJ 2811 熄燈問題 POJ 1222

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

POJ 1222 開關問題

題意 傳送門 poj 1222 題解列舉第一行的開關是否翻轉的狀態,此時決定 l0j l l0 j 的狀態的只有 l1j l l1 j 乙個開關,依次類推可以求出所有的開關翻轉狀態。對於列舉的每乙個狀態,判斷最後一行是否全零即可判斷該方案是否可行。include include include in...