题目:
代码:
//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;}