洛谷 2622 關燈問題II 狀態壓縮

2021-10-23 13:45:50 字數 2233 閱讀 8684

題目描述

現有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 對每個狀態單獨分析,可以把每個開關...