蒟蒻求助
查看原帖
蒟蒻求助
335094
Lucifero楼主2021/1/9 20:17

rt,位运算过于毒瘤

#include <bits/stdc++.h>
using namespace std;
queue<int> r;
bool mark[513];
int step[513],ans;
int constr(int x,int k)
{
	int state=x^(1<<k);
	if (k>2) state^=(1<<(k-3));
	if (k<6) state^=(1<<(k+3));
	if (k%3!=0) state^=(1<<(k-1));
	if (k%3!=2) state^=(1<<(k+1));
	return state;
}
void bfs(int root)
{
	int u,v,i;
	r.push(root),mark[root]=true;
	step[root]=0;
	while(!r.empty())
	{
		u=r.front(),r.pop();
		for(i=1;i<=9;i++)
		{
			v=constr(u,i-1);
			if (!mark[v])
			{
				if (v==0 || v==511)
				{
					ans=step[u]+1;
					return;
				}
				r.push(v),mark[v]=true;
				step[v]=step[u]+1;
			}
		}
	}
}
int main()
{
	//打开所有的灯
	int lig,sta=0,i;	
	for(i=1;i<=9;i++)
	{
		scanf("%d",&lig);
		if (lig==1) sta+=(1<<(9-i));
	}
	if (sta==0 || sta==511)
	{
		printf("0");
		return 0;
	}
	bfs(sta);
	printf("%d",ans);
}
2021/1/9 20:17
加载中...