一、题目
奶牛选美
二、分析
将两个斑点内的坐标归到对应的集合。
两个集合逐一枚举两点之间的距离,求最小值。
三、代码
#include<bits/stdc++.h>
using namespace std;
const int N=2510;
struct node
{
int x,y;
}e1[N],e2[N];
int idx1,idx2;
int n,m;
string ch[N];
int X[5]={-1,0,1,0},Y[5]={0,1,0,-1};
void dfs1(int x,int y)
{
if(ch[x][y]!='X')
return ;
ch[x][y]='.';
e1[idx1++]={x,y};
for(int i=0;i<4;i++)
{
dfs1(x+X[i],y+Y[i]);
}
}
void dfs2(int x,int y)
{
if(ch[x][y]!='X')
return ;
ch[x][y]='.';
e2[idx2++]={x,y};
for(int i=0;i<4;i++)
{
dfs2(x+X[i],y+Y[i]);
}
}
int fL(node n1,node n2)
{
return abs(n1.x-n2.x)+abs(n1.y-n2.y);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>ch[i];
ch[i]=' '+ch[i];
}
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(ch[i][j]=='X'&&!idx1)
dfs1(i,j);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
if(ch[i][j]=='X')
dfs2(i,j);
int Min=0x3f3f3f3f;
for(int i=0;i<idx1;i++)
{
for(int j=0;j<idx2;j++)
{
Min=min(Min,fL(e1[i],e2[j]));
}
}
cout<<Min-1<<endl;
return 0;
}
|