題目大意:
有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...