#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<string>
#define le_f le=(le+1)%500000;
#define ri_f ri=(ri+1)%500000;
#include<map>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=1200+5;
const int MAXM=1200;
int done[MAXN][MAXM];
int n,X,Y,sx,sy,ex,ey,mid,le,ri;
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
struct node
{
int x,y,w;
node(int xx=0,int yy=0,int ss=0)
{
x=xx;y=yy;w=ss;
}
}enemy[10500],q[520000];
int MAX(int a,int b){ return a>b?a:b;}
int MIN(int a,int b){ return a<b?a:b;}
bool is_ill(int x,int y)
{
if(x<0||x>=X||y<0||y>=Y)return 1;
return 0;
}
void preslove()
{
int mmid=mid-1;
memset(done,0,sizeof(done));
int i,j,k;
for(j=1;j<=n;j++)
for(i=enemy[j].x-mmid;i<=enemy[j].x+mmid;i++)
{
int a=enemy[j].y+(mmid-abs(enemy[j].x-i));
int b=enemy[j].y-(mmid-abs(enemy[j].x-i));
if(!is_ill(i,a))done[i][a]=1;
if(!is_ill(i,b))done[i][b]=1;
}
}
int bfs()
{
int i;
for(i=1;i<=n;i++)
if(abs(enemy[i].x-sx)+abs(enemy[i].y-sy)<mid||abs(enemy[i].x-ex)+abs(enemy[i].y-ey)<mid)return -1;
preslove();
le=ri=0;
q[ri]=node(sx,sy,0);
ri_f;//预处理,相当于ri++;
done[sx][sy]=1;
while(le!=ri)
{
node e=q[le];le_f;
for(i=0;i<4;i++)
{
int curx=e.x+dx[i];
int cury=e.y+dy[i];
if(is_ill(curx,cury)||done[curx][cury])continue;
if(curx==ex&&cury==ey)
return e.w+1;
q[ri]=node(curx,cury,e.w+1);
ri_f;
done[curx][cury]=1;
}
}
return -1;
}
int main()
{
//freopen("123.txt","r",stdin);
int N,m,i;
while(cin>>N)
while(N--)
{
scanf("%d%d%d",&n,&X,&Y);
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
for(i=1;i<=n;i++)
scanf("%d%d",&enemy[i].x,&enemy[i].y);
if(sx==ex&&sy==ey){printf("%d %d\n",0,0);}
int le=0,ri=X+Y,ans;
while(le<ri)
{
mid=(le+ri)/2;
if(bfs()==-1)ri=mid;
else
{
ans=mid;
le=mid+1;
}
}
printf("%d %d\n",ans,(mid=ans,bfs()));
}
return 0;
}
hdu 2337 Escape from Enemy Territory (预处理+二分+宽搜)
最新推荐文章于 2018-04-24 22:41:51 发布