洛谷 2622 关灯问题 Ⅱ BFS 状压

版权声明: 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;
}

猜你喜欢

转载自blog.csdn.net/nwpu2017300135/article/details/81568166
今日推荐