樣例輸入/輸出後面有~
區域性即整體思想:雖然整體情況看起來巨多,眼花繚亂,但有時候問題的一小部分,其實對應了所有的結果,因為所有的結果都是從這一區域性出發生長出來的(雞湯:細節決定成敗,丟了馬蹄鐵導致戰爭失敗)
本題:第一行就是這樣的「區域性」,任意給出乙個第一行的按開關方案,後面所有行,要想成功,一定是確定的。
具體為:因為按任意乙個元素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盞燈的狀態 ...