現有n盞燈,以及m個按鈕。每一個按鈕能夠同時控制這n盞燈——按下了第i個按鈕,對於全部的燈都有一個效果。按下i按鈕對於第j盞燈,是下面3中效果之一:若是a[i][j]爲1,那麼當這盞燈開了的時候,把它關上,不然無論;若是爲-1的話,若是這盞燈是關的,那麼把它打開,不然也無論;若是是0,不管這燈是否開,都無論。spa
如今這些燈都是開的,給出全部開關對全部燈的控制效果,求問最少要按幾下按鈕才能所有關掉。code
前兩行兩個數,n mget
接下來m行,每行n個數,a[i][j]表示第i個開關對第j個燈的效果。string
一個整數,表示最少按按鈕次數。若是沒有任何辦法使其所有關閉,輸出-1io
#include<iostream> #include<cstdio> #include<cstring> using namespace std; int n,m,a[110][11],f[1<<11],ans=0x3f3f3f3f; int read() { int n=0,f=1;char c=getchar(); while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){n=n*10+c-'0';c=getchar();} return n*f; } int main() { n=read(),m=read(); for(int i=1;i<=m;++i) for(int j=1;j<=n;++j) a[i][j]=read(); memset(f,0x3f,sizeof(f)); f[(1<<n)-1]=0; for(int i=(1<<n)-1;i>0;--i) { for(int j=1;j<=m;++j) { int lpk=i; for(int k=1;k<=n;++k) { if(a[j][k]==0)continue; if(a[j][k]==1&&(i&(1<<(k-1))))lpk^=(1<<(k-1)); if(a[j][k]==-1&&!(i&(1<<(k-1))))lpk^=(1<<(k-1)); } f[lpk]=min(f[lpk],f[i]+1); } } if(f[0]>10000000)f[0]=-1; cout<<f[0]; return 0; }