acwing2060. 奶牛选美

题目:

代码:

//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;


}

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值