2014.10.4【大逃亡】

大逃亡(escape.*)

給出數字N(1<=N<=10000),X(1<=x<=1000),Y(1<=Y<=1000),代表有N個敵人分佈一個X行Y列的矩陣上,矩形的行號從0到X-1,列號從0到Y-1再給出四個數字x1,y1,x2,y2,代表你要從點(x1,y1)移到(x2,y2)。在移動的過程中你當然希望離敵人的距離的最小值最大化,現在請求出這個值最大可以爲多少,以及在這個前提下,你最少要走多少步纔可以回到目標點。注意這裏距離的定義爲兩點的曼哈頓距離,即某兩個點的座標分爲(a,b),(c,d),那麼它們的距離爲|a-c|+|b-d|。

輸入:

第一行給出數字N,X,Y

第二行給出x1,y1,x2,y2

下面將有N行,給出N個敵人所在的座標

輸出:

在一行內輸出你離敵人的距離及在這個距離的限制下,你回到目標點最少要移動多少步。

Sample input

2 5 6

0 0 4 0

2 1

2 3

Sample output

2 14

sb搜索題

先跑一遍floodfill算出所有點到離它最近的敵人的距離

然後二分一個距離的最小值,再bfs一下,只能走距離>=mid的格子

唉因爲二分上界打錯了只有90

我做今天的模擬賽真是太逗了各種細節錯還只有260……你看黃巨大又ak了

一定是因爲我沒睡醒

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#define N 1010
#define ok (wx>=0&&wx<x&&wy>=0&&wy<y)
using namespace std;
const int mx[4]={1,0,-1,0};
const int my[4]={0,1,0,-1};
int dis[N][N];
int dis2[N][N];
bool mrks[N][N];
int qx[N*N],qy[N*N];
int n,x,y,x1,y1,x2,y2,t,w,ans,ds;
inline bool jud(int lim)
{
	if (dis[x1][y1]<lim)return 0;
	if (dis[x2][y2]<lim)return 0;
	memset(mrks,0,sizeof(mrks));
	memset(dis2,0,sizeof(dis2));
	t=0;w=1;
	qx[1]=x1;qy[1]=y1;
	mrks[x1][y1]=1;
	while (t<w)
	{
		int nx=qx[++t],ny=qy[t];
		for (int k=0;k<4;k++)
		{
		  int wx=nx+mx[k],wy=ny+my[k];
		  if (ok&&!mrks[wx][wy]&&dis[wx][wy]>=lim)
		  {
		  	dis2[wx][wy]=dis2[nx][ny]+1;
		  	mrks[wx][wy]=1;
		  	qx[++w]=wx;
		  	qy[w]=wy;
		  }
		}
	}
	return mrks[x2][y2];
}
int main()
{
	freopen("escape.in","r",stdin);
	freopen("escape.out","w",stdout);
	scanf("%d%d%d",&n,&x,&y);
	scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
	for (int i=1;i<=n;i++)
	{
		int xx,yy;scanf("%d%d",&xx,&yy);
		qx[++w]=xx;qy[w]=yy;
		mrks[xx][yy]=1;
	}
	while (t<w)
	{
		int nx=qx[++t],ny=qy[t];
		for (int k=0;k<4;k++)
		{
		  int wx=nx+mx[k],wy=ny+my[k];
		  if (ok&&!mrks[wx][wy])
		  {
		  	dis[wx][wy]=dis[nx][ny]+1;
		  	mrks[wx][wy]=1;
		  	qx[++w]=wx;
		  	qy[w]=wy;
		  }
		}
	}
	int l=0,r=x*y;
	while (l<=r)
	{
		int mid=(l+r)>>1;
		if (jud(mid)){ans=mid;ds=dis2[x2][y2];l=mid+1;}
		else r=mid-1;
	}
	printf("%d %d\n",ans,ds);
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章