大佬们,调了好长时间都没调出来,求助啊
  • 板块P5507 机关
  • 楼主lizichang
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/9 22:55
  • 上次更新2023/10/27 03:34:22
查看原帖
大佬们,调了好长时间都没调出来,求助啊
373819
lizichang楼主2022/11/9 22:55
//双向BFS 
#include<bits/stdc++.h>
#include<queue>
#include<map>
#include<cstdio>
using namespace std;
const int N=1<<24;
int nx[50][50],choice[N],fa[N],ans[N],g[N];
int cnt,s,si,ni,button,Start;
map<int, int> rec[2];
queue< pair<int,bool> > q;
void print()
{
	cout<<1;
	int state=0;
	while(Start!=state)
	{
		ans[++cnt]=choice[state];
		state=fa[state];
	}
	cout<<cnt<<endl;
	for(int i=cnt;i;i--)
		cout<<ans[i]<<' ';
	exit(0);
}
void check(int x,pair<int,bool> h)
{
	if(rec[h.second^1].count(x)==true)
	{
		print();
	}
	else
	{
		rec[h.second][x]=rec[h.second][h.first]+1;
		q.push(make_pair(x,h.second));
	}
	return ;
}
int main()
{
	for(int i=0;i<12;i++)
	{
		cin>>button;
		Start|=(button-1)<<(i*2);
		for(int j=0;j<4;j++)
		{
			cin>>nx[i][j];
			nx[i][j]-=1;
		}
	}
	//cout<<Start<<endl;
	q.push(make_pair(Start,0));
	q.push(make_pair(0,1));
	while(!q.empty())
	{
		pair<int,bool> h=q.front();
		s=h.first;
		q.pop();
		for(int i=0;i<12;i++)
		{
			if(!h.second)
			{
				si=s>>i*2&3;
				s^=(((si+1)&3)<<(i*2));
				si=nx[i][si];
				s^=((((s>>si*2)+1)&3)<<(si*2));
			}
			else
			{
				si=s>>i*2&3;
				s^=((si==0?3:si-1)<<(i*2));
				si=nx[i][si==0?3:si-1];
				s^=(((s>>si*2&3==0?3:(s>>si*2)-1)&3)<<(si*2));
			}
			//cout<<s<<' '<<h.second<<endl;
			if(!g[s])
			{
				g[s]=g[h.first]+1;
				if(h.second)	fa[h.first]=s,choice[s]=i+1;
				else fa[s]=h.first,choice[h.first]=i+1;
				check(s,h);
			}
		}
	}
	return 0;
}
2022/11/9 22:55
加载中...