POJ 2811 熄燈問題 POJ 1222

2021-09-25 06:08:16 字數 2929 閱讀 6008

樣例輸入/輸出後面有~

區域性即整體思想:雖然整體情況看起來巨多,眼花繚亂,但有時候問題的一小部分,其實對應了所有的結果,因為所有的結果都是從這一區域性出發生長出來的(雞湯:細節決定成敗,丟了馬蹄鐵導致戰爭失敗)

本題:第一行就是這樣的「區域性」,任意給出乙個第一行的按開關方案,後面所有行,要想成功,一定是確定的。

具體為:因為按任意乙個元素a(i, j),都會使同列上一行元素a(i-1, j)受影響,第一行的方案如果確定,會導致第一行的燈有亮有滅,所以第二行一定要按那些第一行亮著的燈下面對應的開關(不這樣按,一定失敗,只有第二行能改變第一行,第三行以上都影響不了第一行),如第一行亮的燈是(0, 2, 3, 5)->對應第二行按的方案就一定是(0, 2, 3, 5),由此遞推到最後一行,從這裡我們知道了上一行按後的結果(亮的燈-–矩陣中的1),就一定是下一行按的方案

結束條件:每種按第一行的方案(一共2^5=64種),對應的最後一行(第5行)是否符合條件(全滅),因為只有最後一行狀態不確定,包括最後一行在內,每一行都完成了使上一行全滅的任務,等最後一行按完以後,前n-1行全滅了已經,故只需考慮最後一行(即第n行)

儲存方式上來看:只有0/1矩陣 想到 ->位運算(時間和空間上都會優化很多),位運算的相關技巧 見文末(需要相關的計算機組成原理知識,涉及到機器數的表示)

這裡用到的技巧是:用0 ~ 2^5-1=63 對應的二進位制(即0000 0000b ~ 0011 1111b)來模擬第一行(for(int n=0; n < 64; ++n)

#include

#include

#include

#include

using

namespace std;

char orilights[5]

;char lights[5]

;//測試用的燈矩陣

char result[5]

;int

getbit

(char c,

int i)

void

setbit

(char

& c,

int i,

int v)

else

c &=~

(1<< i);}

void

flipbit

(char

& c,

int i)

void

outputresult

(int t,

char result)

cout <

intmain()

// outputresult(t, orilights); //測試讀入

for(

int n =

0; n <64;

++n)}if

(i <4)

lights[i+1]

^= switchs;

//將第i行燈的狀態賦值給switchs: 從而得到第i+1行的開關策略

//如i行燈01001001,則下一行按開關為01001001

switchs = lights[i]

;//在下一次迴圈的開始,result[i+1] = switchs; }if

(lights[4]

==0)}

}return0;

}

201

1010

1001

1100

1001

1001

0101

1100

0010

1010

1011

0010

1110

1100

0101

00

puzzle #110

1001

1101

0100

1011

1001

0001

0000

puzzle #210

0111

1100

0000

0100

1101

0110

1101

#include

using

namespace std;

int press[7]

[8]=

;int puzzle[7]

[7];

void

carry

(int a[

8])if

(a[i][1

]!=0)

}}void

input()

}}void

output

(int n)

printf

("\n");

}}bool

test()

}bool flag =

true

;for

(int i =

1; i <6;

++i)

return flag;

}int

main()

}}return0;

}

POJ2811熄燈問題

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

POJ 2811 熄燈問題 列舉

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

POJ熄燈問題(列舉法)

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