平面曼哈顿距离
用途:求平面直角坐标系内任意一个点到坐标内所有指定点的最大距离最小值
dis(a,b)=abs(i-i*)+abs(j-j*);
=max(i-i*,i*-i)+max(j-j*,j*-j)
=max(abs( (i-j)-(i*-j*)),abs((i+j)-(i*+j*)) )
发现每个点如果要求到其他点的距离最值
只需要维护自身的i+j,i-j,和其他所有点的max(i+j),max(i-j),min(i+j),min(i-j)
就可以通过,4*n*m的时间复杂度(基本上线性的)找出答案
题目描述 给定一个 n×mn×m 的矩阵,每个位置都有一个颜色,黑色或白色,要求你选择一个位置(不计这个位置上是什么颜色),使得整个位置到所有黑色格子的曼哈顿距离的最大值最小。const int WR=1001000;int INF=1e9; char zhen [1000+3][1000+3]; int n,m; inline void deal() { n=re(),m=re(); int minjian=INF,minjia=INF,maxjian=-INF,maxjia=-INF; _f(i,1,n) { scanf("%s",zhen[i]+1); _f(j,1,m) { if(zhen[i][j]=='B')//是黑色 { minjian=min(minjian,i-j); minjia=min(minjia,i+j); maxjian=max(maxjian,i-j); maxjia=max(maxjia,i+j); } } } int posx=0,posy=0,minans=INF; _f(i,1,n) { _f(j,1,m) { int ans1=(i-j)-minjian,ans2=(i+j)-minjia; int ans3=(maxjian-(i-j)),ans4=maxjia-(i+j); int anstrue=max(ans1,max(ans2,max(ans3,ans4)));//这个点的最小值 if(anstrue<minans) { posx=i,posy=j; minans=anstrue; } } } chu("%d %d\n",posx,posy); } int main() { int t=re(); _f(i,1,t) { deal(); } return 0; }