现有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; }