分析:对状态进行bfs转移,剪枝掉出现过的状态;
#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[110][20];
map<int,int> vis;
struct node{int cd,num;};
queue<node> Q;
int bfs()
{
node cur={(1<<n)-1,0},nex;
Q.push(cur);vis[(1<<n)-1]=1;
while (!Q.empty())
{
cur=Q.front();Q.pop();
if(cur.cd==0) return cur.num;
for (int i=1;i<=m;i++)
{
nex.cd=cur.cd;nex.num=cur.num+1;
for (int j=1;j<=n;j++)
{
if(a[i][j]==1 && (1<<(j-1)&nex.cd)) nex.cd=nex.cd&((1<<n)-1-(1<<(j-1)));
if(a[i][j]==-1 && !(1<<(j-1)&nex.cd)) nex.cd=nex.cd|(1<<(j-1));
}
if(!vis[nex.cd]) {Q.push(nex);vis[nex.cd]=1;}
}
}
return -1;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=1;i<=m;i++)
for (int j=1;j<=n;j++) scanf("%d",&a[i][j]);
printf("%d\n",bfs());
return 0;
}