WA#6 90pts求助,代码较易读,悬赏关注一个
查看原帖
WA#6 90pts求助,代码较易读,悬赏关注一个
378706
MoyunAllgorithm楼主2023/4/29 16:10

以灯的状态为点跑bfs

#include <bits/stdc++.h>
#define PII pair<int,int>
using namespace std;
int N,M;
vector<int>gra[1<<11];
int a[105][15];
bool vis[1<<11];
int bfs()
{
	queue<PII>q;
	q.push({(1<<N)-1,0});
	vis[(1<<N)-1]=1;
	while(q.size())
	{
		int u=q.front().first,d=q.front().second;
		q.pop();
		if(u==0) return d;
		for(auto v:gra[u])
		{
			if(vis[v]) continue;
			vis[v]=1;
			q.push({v,d+1});
		}
	}
	return -1;
}
int main()
{
	scanf("%d %d",&N,&M);
	for(int i=1;i<=M;i++)
		for(int j=1;j<=N;j++) 
			scanf("%d",&a[i][j]);
	for(int i=0;i<(1<<N);i++)
	{
		for(int j=1;j<=M;j++)
		{
			int nxt=0;
			for(int k=1;k<=N;k++)
			{
				nxt<<=1;
				int dig=(i>>k-1)&1;
				if(a[j][k]==1&&dig==1) dig=0;
				else if(a[j][k]==-1&&dig==0) dig=1;
				nxt+=dig;
			}
            //枚举一个状态摁下某按钮后的新状态
		//	printf("%d %d\n",i,nxt);
			gra[i].push_back(nxt);
		}
	}
	printf("%d\n",bfs());
	return 0;
}
2023/4/29 16:10
加载中...