Luogu P2622 關燈問題II

2021-10-23 13:25:16 字數 1367 閱讀 1092

現有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的話,如果這盞燈是關的,那麼把它...