描述有乙個由按鈕組成的矩陣,其中每行有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 11 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熄燈問題
題目描述 事實上,只用列舉第一行或者第一列按鈕的狀態即可。下面以列舉第一行按鈕的狀態為例。因為第一行燈的狀態由第一行和第二行的按鈕決定,所以第一行按鈕的狀態確定之後,為是第一行的燈全部熄滅,第二行按鈕的狀態也就唯一確定了。例如,當第一行按鈕的狀態確定之後 因此,在第一行按鈕的狀態確定之後,第二行按鈕...