题目:http://www.luogu.org/problem/show?pid=2622
分析:状压bfs,学名隐式图搜索?
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
const int Tmax=105,Tmax2=15,Tmax3=2048;
struct node{
int s,w;
};
int n,m,a[Tmax][Tmax2];
bool v[Tmax3];
queue<node> Q;
void bfs()
{
int i,j,ss;
node tmp,tmp2;
tmp.s=(1<<n)-1;
tmp.w=0;
Q.push(tmp);
v[tmp.s]=true;
while(!Q.empty())
{
tmp=Q.front();
Q.pop();
if(tmp.s==0){
printf("%d",tmp.w);
return;
}
for(i=1;i<=m;i++)
{
ss=tmp.s;
for(j=0;j<n;j++)
if(a[i][j]==1&&(ss&(1<<j))) ss^=(1<<j);
else if(a[i][j]==-1&&!(ss&(1<<j))) ss^=(1<<j);
if(!v[ss])
{
tmp2.s=ss;
tmp2.w=tmp.w+1;
Q.push(tmp2);
v[ss]=true;
}
}
}
printf("-1");
return;
}
int main()
{
int i,j;
scanf("%d%d",&n,&m);
for(i=1;i<=m;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
bfs();
return 0;
}