赞
踩
- //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;
-
-
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。