現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈——按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一:如果a[i][j]為1,那麼當這盞燈開了的時候,把它關上,否則不管;如果為-1的話,如果這盞燈是關的,那麼把它開啟,否則也不管;如果是0,無論這燈是否開,都不管。
現在這些燈都是開的,給出所有開關對所有燈的控制效果,求問最少要按幾下按鈕才能全部關掉。
前兩行兩個數,n m
接下來m行,每行n個數,a[i][j]表示第i個開關對第j個燈的效果。
乙個整數,表示最少按按鈕次數。如果沒有任何辦法使其全部關閉,輸出-1
3
21 0 1
-1 1 0
2
思路:它的資料是n
<=10
n<=10
n<=1
0,於是我們可以用狀態壓縮
先分析它的題目,它的起點是一定的,終點也一定,求最小步數,滿足邊權都為1,很明顯是一道狀壓bfs
將它的狀態存到佇列裡,一開始全部為1,那考慮怎樣轉移
我們設a[i
][j]
a[i][j]
a[i][j
]表示第i
ii個開關可以改變第j
jj個燈
當a [i
][j]
a[i][j]
a[i][j
]為1,並且當前狀態的第j
jj位為1時,則當前狀態為當前狀態異或2^j-1次方,即改變第j位上的值為0
當a [i
][j]
a[i][j]
a[i][j
]為-1,並且當前狀態的第j
jj位為0時,則當前狀態為當前狀態或2^j-1次方,即改變第j位上的值為1
(這個自己模擬一下就可以推出)
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
int n, m;
int a[30]
[30];
int f[
1<<10]
[4], v[
1<<10]
;void
bfs()if
(!v[s])}
}}printf
("-1");
}int
main()
P 2622 關燈問題
現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它開啟,否則也不管 如果是0,無論這燈是否開,都不...
洛谷 2622 關燈問題II
現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它開啟,否則也不管 如果是0,無論這燈是否開,都不...
洛谷 P2622 關燈問題
輸入輸出樣例 說明切入正題 解 廣搜 手動分割 現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它...