为什么 WA 3?????
查看原帖
为什么 WA 3?????
749630
wxzzzz楼主2024/8/24 18:55

因为没做出这题下大分了。

思路:

  1. 逃跑者走直线

  2. 枚举它跑向哪个点然后取最优

  3. 追击者只会每次朝它走,因为往预测的方向走则逃跑者可以转向使其不优

然后模拟:

#include <bits/stdc++.h>
#define ll long long
#define ull unsigned ll
#define rll register ll
#define cll const ll
#define N 15
using namespace std;
inline ll read()
{
    rll x=0;bool f=1;register char c=getchar();
    while(c<48||c>57){if(c=='-') f=0;c=getchar();}
    while(c>=48&&c<=57){x=x*10+(c^48);c=getchar();}
    return f?x:-x;
}
inline void write(ll x)
{
    if(x<0) putchar('-'),x=-x;
    if(x>9) write(x/10);
    putchar(x%10+48);
}
cll dx[4]={0,-1,0,1},dy[4]={-1,0,1,0};
ll n,px1,py1,px2,py2,ans,dis[N][N],dis1[N][N],dis2[N][N];
pair<ll,ll> lst[N][N],lst1[N][N],lst2[N][N];
vector<pair<ll,ll>> rd;
char g[N][N];
inline void bfs(ll sx,ll sy)
{
	for(rll i=1;i<=n;i++)
		for(rll j=1;j<=n;j++)
			dis[i][j]=1e18,lst[i][j]={0,0};
	queue<pair<ll,ll>> q;
	dis[sx][sy]=0;
	q.push({sx,sy});
	while(!q.empty())
	{
		pair<ll,ll> tmp=q.front();
		q.pop();
		cll x=tmp.first,y=tmp.second;
		for(rll i=0;i<4;i++)
		{
			cll nx=x+dx[i],ny=y+dy[i];
			if(nx>=1&&nx<=n&&ny>=1&&ny<=n&&g[nx][ny]=='0'&&dis[nx][ny]==1e18)
			{
				lst[nx][ny]={x,y};
				dis[nx][ny]=dis[x][y]+1;
				q.push({nx,ny});
			}
		}
	}
	for(rll i=1;i<=n;i++)
		for(rll j=1;j<=n;j++)
			if(g[i][j]=='0'&&!lst[i][j].first)
				lst[i][j]={i,j};
}
inline ll calc(ll tx,ll ty)
{
	rll i1=tx,j1=ty,nowx=px2,nowy=py2,ret=0;
	rd.clear();
	while(1)
	{
		rd.push_back({i1,j1});
		if(i1==px1&&j1==py1) break;
		pair<ll,ll> tmp=lst1[i1][j1];
		i1=tmp.first,j1=tmp.second;
	}
	reverse(rd.begin(),rd.end());
	for(rll i=rd.size();i<=n*2;i++)
		rd.push_back({tx,ty});
	for(pair<ll,ll> i:rd)
	{
		cll x=i.first,y=i.second;
		vector<pair<ll,ll>> rd2;
		rll i2=x,j2=y;
		bfs(nowx,nowy);
		while(1)
		{
			pair<ll,ll> tmp=lst[i2][j2];
			if(tmp.first==nowx&&tmp.second==nowy)
				break;
			i2=tmp.first,j2=tmp.second;
		}
		ret++;
		if(nowx==x&&nowy==y)
			break;
		nowx=i2,nowy=j2;
		i2=x,j2=y;
		bfs(nowx,nowy);
		while(1)
		{
			pair<ll,ll> tmp=lst[i2][j2];
			if(tmp.first==nowx&&tmp.second==nowy)
				break;
			i2=tmp.first,j2=tmp.second;
		}
		nowx=i2,nowy=j2;
		if(nowx==x&&nowy==y)
			break;
	}
	return ret;
}
int main()
{
    n=read();
    px1=read(),py1=read();
    px2=read(),py2=read();
    for(rll i=1;i<=n;i++)
    	scanf("%s",g[i]+1);
    bfs(px2,py2);
    if(dis[px1][py1]==1e18)
    {
    	printf("inf");
    	return 0;
	}
	for(rll i=1;i<=n;i++)
	{
		for(rll j=1;j<=n;j++)
		{
			if(g[i][j]=='1') continue;
			dis2[i][j]=dis[i][j];
			lst2[i][j]=lst[i][j];
		}
	}
	bfs(px1,py1);
	for(rll i=1;i<=n;i++)
	{
		for(rll j=1;j<=n;j++)
		{
			if(g[i][j]=='1') continue;
			dis1[i][j]=dis[i][j];
			lst1[i][j]=lst[i][j];
		}
	}
    for(rll i=1;i<=n;i++)
    	for(rll j=1;j<=n;j++)
    		if(g[i][j]=='0')
    			ans=max(ans,calc(i,j));
    write(ans);
    return 0;
}

求查锅

2024/8/24 18:55
加载中...