題目描述
現有n
nn盞燈,以及m
mm個按鈕。每個按鈕可以同時控制這n
nn盞燈——按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一:如果a[i
][j]
a[i][j]
a[i][j
]為11
1,那麼當這盞燈開了的時候,把它關上,否則不管;如果為-1
11的話,如果這盞燈是關的,那麼把它開啟,否則也不管;如果是0,無論這燈是否開,都不管。
現在這些燈都是開的,給出所有開關對所有燈的控制效果,求問最少要按幾下按鈕才能全部關掉。
輸入格式
前兩行兩個數,n,m
n,mn,
m 接下來m
mm行,每行n
nn個數,a[i
][j]
a[i][j]
a[i][j
]表示第i個開關對第j個燈的效果。
輸出格式
乙個整數,表示最少按按鈕次數。如果沒有任何辦法使其全部關閉,輸出−1-1
−1輸入輸出樣例
輸入 #132
1 0 1
-1 1 0
輸出 #1
2說明/提示
對於20
2020
%資料,輸出無解可以得分。
對於20
2020
%資料,n
<=5
n<=5
n<=5
對於20
2020
%資料,m
<=20
m<=20
m<=2
0 上面的資料點可能會重疊。
對於100
10010
0%資料 n
<=10
,m
<
=100
n<=10,m<=100
n<=1
0,m<=1
00解題思路
狀態壓縮走起:
設f [i
]f[i]
f[i]
代表到達i
ii這種狀態的最少操作次數.
題目三種操作.
如果a [i
][j]
a[i][j]
a[i][j
]為1,那麼當這盞燈開了的時候,把它關上,否則不管;如果為-1的話,如果這盞燈是關的,那麼把它開啟,否則也不管;如果是0,無論這燈是否開,都不管。
-----------------介紹一下&---------------
按位與操作,1
11&0=0
,1
0=0,1
0=0,1&1=1
,0
1=1,0
1=1,0&0=0
;0=0;
0=0;
兩邊全部是1才為1,否則為0.
-----------------介紹完畢-------------------
&操作可以判斷某一位上的燈是否開著.(注意只能是這一位.
如果你會了如何判斷這個燈開著,那麼關著就是**!**了
這樣我們的問題就得以解決了.
**
#include
#include
#include
#include
#include
using namespace std;
int n,m,ans,a[
110][12
],f[
1<<10]
;int main()
f[(1<]=0;
for(int i=(1
<;i>=
0;i--
)//列舉狀態
f[now]
=min
(f[now]
,f[i]+1
);//常規操作,求最小操作次數.因為我們可以通過i狀態操作按乙個開關到達now狀態.所以是f[i]+1.}}
printf
("%d"
,f[0]==
1061109567?-
1:f[0]
);//這個奇怪的數字就是memset 0x3f得出來的
}
洛谷 2622 關燈問題II
現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它開啟,否則也不管 如果是0,無論這燈是否開,都不...
洛谷P2622 關燈問題II(狀態壓縮)
現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈 按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一 如果a i j 為1,那麼當這盞燈開了的時候,把它關上,否則不管 如果為 1的話,如果這盞燈是關的,那麼把它開啟,否則也不管 如果是0,無論這燈是否開,都不...
洛谷 P2622 關燈問題II
洛谷p2622 tag 狀態壓縮 題目大意 n個燈,m個按鈕,每個按鈕都可以控制所有燈,給出每個按鈕對每個燈的影響,求從全開到全關的最短步數。題目分析 每盞燈只有兩個狀態,即開與關,記為0和1,則所有燈的狀態總數為2 n n 3時,有000,001,010,100 對每個狀態單獨分析,可以把每個開關...