打表某个状态(01101)通过某个开关变为某个状态(10001)

#include<bits/stdc++.h>
using namespace std;
int n,m;
int a[105][15];
int g[1<<10][105];//开关状态i进行操作j后的开关状态
void init()
{
	for(int i=0;i<(1<<10);i++)
	{
		bool s[11];
		for(int j=0,t=i;j<11;j++,t>>=1)
			s[j]=t&1;
		for(int j=0;j<m;j++)
		{
			bool t[11];
			for(int k=0;k<11;k++)t[k]=s[k];
			for(int k=0;k<n;k++)
				if(a[j][k]==1 && t[k]==1)t[k]=0;
				else if(a[j][k]==-1 && t[k]==0)t[k]=1;
			int r=0;
			for(int k=0;k<11;k++)
				if(t[k])r|=(1<<k);
			g[i][j]=r;
		}	
	}
}
int f[1<<10];
queue<pair<int,int> >q;
void bfs(int sx)
{
	q.push({sx,0});
	while(!q.empty())
	{
		int x=q.front().first,t=q.front().second;
		q.pop();
		f[x]=1;
		if(!x)
		{
			cout<<t;
			return;
		}
		for(int i=0;i<m;i++)
			if(!f[g[x][i]])q.push({g[x][i],t+1});
	}
	cout<<-1;
}
signed main()
{
	cin>>n>>m;
	for(int i=0;i<m;i++)
		for(int j=0;j<n;j++)
			cin>>a[i][j];
	init();
	bfs((1<<n)-1);
	return 0;
}

0 comments

No comments so far...

Information

ID
403
Time
1000ms
Memory
256MiB
Difficulty
9
Tags
# Submissions
13
Accepted
3
Uploaded By