因为没做出这题下大分了。
思路:
逃跑者走直线
枚举它跑向哪个点然后取最优
追击者只会每次朝它走,因为往预测的方向走则逃跑者可以转向使其不优
然后模拟:
#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;
}
求查锅