洛谷 P2622 關燈問題II

2021-09-12 10:28:00 字數 1539 閱讀 5258

現有n盞燈,以及m個按鈕。每個按鈕可以同時控制這n盞燈——按下了第i個按鈕,對於所有的燈都有乙個效果。按下i按鈕對於第j盞燈,是下面3中效果之一:如果a[i][j]為1,那麼當這盞燈開了的時候,把它關上,否則不管;如果為-1的話,如果這盞燈是關的,那麼把它開啟,否則也不管;如果是0,無論這燈是否開,都不管。

現在這些燈都是開的,給出所有開關對所有燈的控制效果,求問最少要按幾下按鈕才能全部關掉。

前兩行兩個數,n m

接下來m行,每行n個數,a[i][j]表示第i個開關對第j個燈的效果。

乙個整數,表示最少按按鈕次數。如果沒有任何辦法使其全部關閉,輸出-1

輸入樣例32

1 0 1

-1 1 0

輸出樣例

思路學習自

做到這到題是因為做到一道狀態壓縮dp的題,看不太懂所以決定從較為簡單的做起。狀態壓縮正如字面所講,假如有很多串1和0來組成的字串,每個1和0代表這一種含義,如果我們用陣列去儲存它,當我們想要將其中一串字串進行移動轉移的話,就要遍歷每乙個位置上的數將其轉移,可想而知,這會相當的消耗時間。那麼狀態壓縮就是將這一串1和0組成的數字看作是二進位制數並轉化成十進位制儲存,那麼空間與時間都會得到相應的縮小,具體實現的原理請轉至鏈結處。

\(口__口)/

下面是這道題的**:

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

#define inf 0x3f3f3f3f3f3f3f3f

#define met(a, b) memset(a, b, sizeof(a))

#define ll long long

using

namespace std;

struct node

;int map[

110][15

];int n, m;

intbfs

(int s));

int vis[

2048]=

; vis[s]=1

;while

(!que.

empty()

)}else

if(map[i]

[j]==-1

)}if(vis[now]

)continue

;//已經到達過的狀態跳過

if(now ==0)

return t.step+1;

//如果狀態達到要求就返回到這個狀態的步數

vis[now]=1

; que.

push

((node));

}}return-1

;}intmain()

}int re =

bfs(s)

; cout << re << endl;

return0;

}

洛谷 P2622 關燈問題II

洛谷p2622 tag 狀態壓縮 題目大意 n個燈,m個按鈕,每個按鈕都可以控制所有燈,給出每個按鈕對每個燈的影響,求從全開到全關的最短步數。題目分析 每盞燈只有兩個狀態,即開與關,記為0和1,則所有燈的狀態總數為2 n n 3時,有000,001,010,100 對每個狀態單獨分析,可以把每個開關...

洛谷 P2622 關燈問題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的話,如果這盞燈是關的,那麼把它...