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]); }