求助!!!双向BFS
  • 板块P5507 机关
  • 楼主bzqd
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/24 13:38
  • 上次更新2024/6/24 17:48:04
查看原帖
求助!!!双向BFS
1123386
bzqd楼主2024/6/24 13:38

步数示例都是正确的,但步骤没有一个一样

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=1e6+5;
const ll INF=0x7fffffffffffff;
inline ll read(){
	ll cnt=0,flag=1;
	char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') flag=-1;c=getchar();}
	while(c>='0'&&c<='9') cnt=(cnt<<1)+(cnt<<3)+(c^48),c=getchar();
	return flag*cnt;
}
struct node
{
	string s;
};
queue<node> q[2];
map<string,pair<ll,vector<ll> > > vis[2];
ll a[14][6];
inline void bfs(node start,node end)
{
	q[0].push(start),q[1].push(end);
	vis[0][start.s].first=0,vis[1][end.s].first=0;
	ll op=0;
	while(!q[op].empty())
	{
		node x=q[op].front();
		q[op].pop();
		if(vis[op^1][x.s].first)
		{
			printf("%lld\n",vis[op][x.s].first+vis[op^1][x.s].first);
			vector<ll> v=vis[0][x.s].second;
			for(ll i=0;i<(ll)v.size();++i) printf("%lld ",v[i]);
			v=vis[1][x.s].second;
			for(ll i=(ll)v.size()-1;i>=0;--i) printf("%lld ",v[i]);
			exit(0);
		}
		for(ll i=1;i<=12;++i)
		{
			node y=x;
			ll tmp=a[i][y.s[i]-'0'];
			(y.s[i]=='4')?(y.s[i]='1'):(y.s[i]+=1);
			(y.s[tmp]=='4')?(y.s[tmp]='1'):(y.s[tmp]+=1);
			if(!vis[op][y.s].first)
			{
				vis[op][y.s].first=vis[op][x.s].first+1;
				vis[op][y.s].second=vis[op][x.s].second;
				vis[op][y.s].second.push_back(i);
				q[op].push(y);
			}
		}
		op^=1;
	}
}
int main()
{
	node start,end;
	for(ll i=1;i<=12;++i)
	{
		for(ll j=1;j<=5;++j)
		{
			ll x=read();
			if(j==1)
			{
				start.s+=char(x+'0');
			}
			else
			{
				a[i][j-1]=x;
			}
		}
	}
	start.s=" "+start.s;
	end.s=" 111111111111";
	bfs(start,end);
	return 0;
}
//THIS[10DATA[7IS]]MADE[8BY[9NETTLE]]
//570 877
2024/6/24 13:38
加载中...