洛谷 P2622 關燈問題

2021-09-02 14:13:38 字數 2633 閱讀 1016

輸入輸出樣例

說明切入正題(解)

廣搜——————————————手動分割——————————————

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

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

輸入格式:

前兩行兩個數,n m

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

輸出格式:

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

輸入樣例#1:32

1 0 1

-1 1 0

輸出樣例#1:對於20%資料,輸出無解可以得分。

對於20%資料,n<=5

對於20%資料,m<=20

上面的資料點可能會重疊。

對於100%資料 n<=10,m<=100

——————————————手動分割——————————————

我的想法:20分挺好的

看到題目,n<=10?搜尋?

很好,全部mle(?)

可能爆棧了

定義f[j]表示當前燈的狀態為j的最小花費,初始狀態f[0]=0f[0]=0,目標狀態f[(1具體來說,若(i,j)輸入的x=.=1x==1ai|=1<<(j-1),若輸入的x==-1x==−1bi|=1<<(j-1);

轉移時當前狀態stasta轉移為(sta | ai) & (~ bi)就能做到燈的開關變換了。

#include.h>

#define il inline

#define ll long

long

#define re register

#define for

(i,a,b)

for(re int

(i)=

(a);

(i)<=

(b);

(i)++

)#define bor

(i,a,b)

for(re int

(i)=

(b);

(i)>=

(a);

(i)--

)using namespace std;

const

int n=

105;

int n,m,a[n]

,b[n]

,f[1

<<11]

;bool vis[

1<<11]

;queue<

int>

q;int

main()

memset

(f,0x3f

,sizeof

(f))

; f[0]

=0;q.push(0

);while

(!q.

empty()

)}} cout<<

(f[lim]

==0x3f3f3f3f?-

1:f[lim]);

return0;

}

——————————————手動分割——————————————

咳咳既然你往下看了,就告訴你個秘密

廣搜也可以ac……

我還以為我只會寬搜了呢,差點打成寬搜了……

#include 

#include

#include

#include

using namespace std;

int n,m,a[

100][10

];bool vis[

1<<11]

;struct pii

;queue

que;

void

out(

int x,

int dep)

//輸出二進位製用

intbfs

(int st)

//模版打法 );

vis[st]=1

; pii now,nxt;

while

(!que.

empty()

)}return-1

;}intmain()

printf

("%d\n"

,bfs((

1<))

;//st初始化為111...(n位)

return0;

}

——————————————手動分割——————————————

廣搜~~~~~~

狀壓~~~~~~

orz orz ↑↑

洛谷p2622 關燈問題

乙個比較典型的狀態壓縮演算法,不過現在還有點沒看懂。等留著以後再看.include include include include include includeusing namespace std int read while ss 0 ss 9 return f x void print in...

洛谷 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,無論這燈是否開,都不...