luogu2622开灯问题2

#include<iostream>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue> 
using namespace std;
int n,m;
int maze[150][150];
int SZ;
const int inf=2147483233;
queue<int> q;
int ns;
bool inq[10100];
int dis[10100];
int spfa()
{
    for(int i=0;i<SZ;i++)dis[i]=inf;
    q.push(SZ-1);
    inq[SZ-1]=1;
    dis[SZ-1]=0;
    while(!q.empty())
    {
        int now=q.front();
        q.pop();
        inq[now]=0;
        for(int i=0;i<m;i++)
        {
            ns=now;
            for(int j=0;j<n;j++)
            {
                if(maze[i][j]==-1)ns=(ns|(1<<j));
                if(maze[i][j]==1)ns=(ns&(~(1<<j)));
            }
            if(dis[ns]>dis[now]+1)
            {
                dis[ns]=dis[now]+1;
                if(!inq[ns]){inq[ns]=1;q.push(ns);}
            }
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=0;i<m;i++)
        for(int j=0;j<n;j++)scanf("%d",&maze[i][j]);
    SZ=1<<n;
    spfa();
    if(dis[0]==inf)printf("-1");
    else printf("%d",dis[0]);
}
View Code

 

posted @ 2017-10-17 15:03  探险家Mr.H  阅读(114)  评论(0编辑  收藏  举报