2811 熄燈問題(列舉)

2022-06-20 18:03:09 字數 2031 閱讀 9548

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

在上圖中,左邊矩陣中用x標記的按鈕表示被按下,右邊的矩陣表示燈狀態的改變。對矩陣中的每盞燈設定乙個初始狀態。請你按按鈕,直至每一盞等都熄滅。與一盞燈毗鄰的多個按鈕被按下時,乙個操作會抵消另一次操作的結果。在下圖中,第2行第3、5列的按鈕都被按下,因此第2行、第4列的燈的狀態就不改變。

請你寫乙個程式,確定需要按下哪些按鈕,恰好使得所有的燈都熄滅。根據上面的規則,我們知道1)第2次按下同乙個按鈕時,將抵消第1次按下時所產生的結果。因此,每個按鈕最多隻需要按下一次;2)各個按鈕被按下的順序對最終的結果沒有影響;3)對第1行中每盞點亮的燈,按下第2行對應的按鈕,就可以熄滅第1行的全部燈。如此重複下去,可以熄滅第1、2、3、4行的全部燈。同樣,按下第1、2、3、4、5列的按鈕,可以熄滅前5列的燈。

輸入5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。0表示燈的初始狀態是熄滅的,1表示燈的初始狀態是點亮的。

輸出5行組成,每一行包括6個數字(0或1)。相鄰兩個數字之間用單個空格隔開。其中的1表示需要把對應的按鈕按下,0則表示不需要按對應的按鈕。

樣例輸入

0 1 1 0 1 0

1 0 0 1 1 1

0 0 1 0 0 1

1 0 0 1 0 1

0 1 1 1 0 0

樣例輸出

1 0 1 0 0 1

1 1 0 1 0 1

0 0 1 0 1 1

1 0 0 1 0 0

0 1 0 0 0 0

1/*2

遍歷搜尋孔空間的例子

3問題 輸入矩陣燈的乙個狀態,根據規則計算並輸出,怎樣才能使燈恰好全部熄滅

4解題思路 按照直接思維,應該搜尋2的30次方中方法,但是根據規律可以將搜尋空間縮小到2的6次方

5只要列舉第一行的按壓情況,結合第二行將第一行的等全部熄滅,第二行的燈用第三行熄滅,依次類推,直到確定第五行

6按壓情況,如果此時燈全部是熄滅的,說明這種列舉情況是可行的。 7*/

8 #include9

int enum_press[64][6]=;

77int press[7][8

];78

int puzzle1[7][8],puzzle2[7][8

]; 79

intrecover();

80int

check();

8182

intmain()

8389

} 90

for(i=0;i<=63;i++)

103}

104for(j=1;j<=4;j++)

116else

117 press[j+1][k]=0

;118

}119

}120

if(check())

121127

break

;128

}129

}130

return0;

131}

132133

intrecover()

134140

}141

} 142

intcheck()

143150

return1;

151}

152/*

153易錯分析

154注意控制方向和五個位置

155*/

POJ 2811 熄燈問題 列舉

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

熄燈問題(百練2811)

include include include using namespace std 解題思路 給定房間燈光現狀矩陣matrix,令操作矩陣press全取0 不管第一行的燈光矩陣是怎麼樣的,第二行的press都有辦法把第一行的燈光全部熄滅 依次類推,第i行的press總有辦法把第i 1行的燈光全部...

POJ2811熄燈問題

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