题目:
代码:
//acwing2060. 奶牛选美
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=55;
const int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
bool st[N][N];
int point[N][N];
char map[N][N];
int n,m; //最好定义在全局变量
void dfs(int x,int y,int u)
{
point[x][y]=u; //这个是为了判断哪一块的代码是第一块的还是第二块的
st[x][y]=true;
for(int i=0;i<4;i++)
{
int nx=x+dx[i],ny=y+dy[i];
if(nx>=0&&nx<n&&ny>=0&&y<m&&!st[nx][ny]&&map[nx][ny]=='X')
{
dfs(nx,ny,u);
}
}
}
int main()
{
int cnt=0; //cnt用来计算有多少个连在一起的大黑块
scanf("%d %d",&n,&m);
for(int i = 0;i < n;i ++)
for(int j=0;j<m;j++)
cin >> map[i][j];
for(int i=0;i<n;i++)
for(int j=0;j<m;j++)
{
//少处理边界问题
if(map[i][j]=='X'&&!st[i][j])
{
dfs(i,j,cnt+1); //如果这里用cnt的话,会cnt一直都是0
}
}
int res = n*m;
for(int i = 0; i < n; i ++ )
for(int j = 0; j < m; j ++ )
{
if(point[i][j] == 1)
{ for(int k = 0; k < n; k ++ )
for(int u = 0; u < m; u ++ )
{
if(point[k][u]==2) //continue;
res = min(res, abs(i - k) + abs(j - u) - 1);
//最后要减一,比如(1,1)与(1,3)之间只有一个(1,2),做差为2,所以要减一
}
}
}
printf("%d\n", res);
return 0;
}