版权声明: https://blog.csdn.net/nwpu2017300135/article/details/81568166
https://www.luogu.org/problemnew/show/P2622
题解:压缩成二进制BFS;
代码:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#define maxs 2050
#define maxm 105
#define maxn 20
using namespace std;
int g[maxm][maxn];
int n,m;
int a[maxs];
void bfs(){
int fin=(1<<n)-1;
queue<int> que;
int now,next;
int i,j;
que.push(fin);
a[fin]=1;//多了一
while(!que.empty()){
now=que.front();
que.pop();
for(i=1;i<=m;i++){
next=now;
for(j=1;j<=n;j++){
if(g[i][j]==1){
if(next&(1<<(j-1)))next-=(1<<(j-1));
}
else if(g[i][j]==-1){
next=next|(1<<(j-1));
}
}
if(a[next])continue;
que.push(next);
a[next]=a[now]+1;
}
}
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++){
for(j=1;j<=n;j++)scanf("%d",&g[i][j]);
}
bfs();
printf("%d",a[0]-1);
// cout << "Hello world!" << endl;
return 0;
}