可以请大家看看用map为什么超时吗,用数组判重就过了
查看原帖
可以请大家看看用map为什么超时吗,用数组判重就过了
217547
New_Born楼主2020/8/28 15:05
#include<bits/stdc++.h>
using namespace std;
const int N=25;
int n;
char a[N][N];
int xx[4]={1,0,-1,0};
int yy[4]={0,1,0,-1};
struct node{
	int x1,y1,x2,y2,k1,k2;
	bool operator < (const node &p) const {
		if(x1!=p.x1)return x1<p.x1;
		if(y1!=p.y1)return y1<p.y1;
		if(x2!=p.x2)return x2<p.x2;
		if(y2!=p.y2)return y2<p.y2;
		if(k1!=p.k1)return k1<p.k1;
		if(k2!=p.k2)return k2<p.k2;
	}
};
map<node,bool>v;
void Exband(node &x)
{
	int nx=x.x1,ny=x.y1,k=x.k1;
	int tx=nx+xx[k],ty=ny+yy[k];
	if(!(nx==n&&ny==n)&&tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]=='E')x.x1=tx,x.y1=ty;
	nx=x.x2,ny=x.y2;k=x.k2;
	tx=nx+xx[k];ty=ny+yy[k];
	if(!(nx==n&&ny==n)&&tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]=='E')x.x2=tx,x.y2=ty;
}
int main()
{
	scanf("%d",&n);
	for(int i=n;i>=1;i--)
		for(int j=1;j<=n;j++)cin>>a[i][j];
	queue<pair<node,int> >q;
	q.push(make_pair((node){1,1,1,1,0,1},0));
	while(q.size())
	{
		node x=q.front().first;
		int dis=q.front().second;
		q.pop();
	/**/	if(v.find(x)!=v.end())continue;
	/**/	v[x]=true;
		if(x.x1==n&&x.y1==n&&x.y2==n&&x.x2==n){
			printf("%d",dis);
			return 0;
		}
		node y=x;Exband(y);if(v.find(y)==v.end())q.push(make_pair(y,dis+1));
		y=x;y.k1=(x.k1+3)%4,y.k2=(x.k2+3)%4;
	/**/	if(v.find(y)==v.end())q.push(make_pair(y,dis+1));
		y=x;y.k1=(x.k1+1)%4,y.k2=(x.k2+1)%4;
	/**/	if(v.find(y)==v.end())q.push(make_pair(y,dis+1));
	}
	return 0;
}
2020/8/28 15:05
加载中...