双向广搜第五个样例过不了,但是AC
查看原帖
双向广搜第五个样例过不了,但是AC
1145259
20231491317xyj楼主2024/8/28 11:57

这个

#include<bits/stdc++.h>
using namespace std;
#define vvi vector<vector<int>>
#define pvi pair<vvi,int>
#define x first
#define endl '\n'
int n,m;
vvi st,ed;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
int extend(queue<pvi>&q,map<vvi,int>&da,map<vvi,int>&db)
{
	pvi t=q.front();
	q.pop();
	vvi u=t.first;
	if(db.count(u))return da[u]+db[u];
	int sx,sy;
	for(int i=0;i<n;i++)
		for(int j=0;j<m;j++)
			if(u[i][j]==0)sx=i,sy=j;
	vvi s=u;
	for(int i=0;i<4;i++)
	{
		u=s;
		int ux=sx+dx[i],uy=sy+dy[i];
		if(ux<0||ux>=n||uy<0||uy>=m)continue;
		swap(u[ux][uy],u[sx][sy]);
		if(da.count(u)==0||da[u]>da[s]+1)
		{
			da[u]=da[s]+1;
			q.push(make_pair(u,da[u]));
			if(db.count(u))return da[u]+db[u];
		}
	}
	return 25;
}
int bfs()
{
	queue<pvi>qa,qb;
	map<vvi,int>da,db;
	qa.push(make_pair(st,0));qb.push(make_pair(ed,0));
	da[st]=0,db[ed]=0;
	while(qa.size()&&qb.size())
	{
		if(da[qa.front().x]+db[qb.front().x]>24)return -1;
		int t;
		if(qa.size()<=qb.size())
		{
			t=extend(qa,da,db);
		}
		else t=extend(qb,db,da);
		if(t<=24)return t;
	}
	return 0;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{	vector<int>t,tt;
		for(int j=1;j<=m;j++)
		{
			int a;
			cin>>a;
			t.push_back(a);
			tt.push_back(m*(i-1)+j);
		}
		st.push_back(t);
		ed.push_back(tt);
	}
	ed[n-1][m-1]=0;
	cout<<bfs()<<endl;
	return 0;
 } 
2024/8/28 11:57
加载中...