原题地址:http://www.usaco.org/index.php?page=viewproblem2&cpid=87

题目描述
Hearing that the latest fashion trend was cows with two spots on their hides, Farmer John has purchased an entire herd of two-spot cows.
Unfortunately, fashion trends tend to change quickly, and the most popular current fashion is cows with only one spot!
FJ wants to make his herd more fashionable by painting each of his cows in such a way that merges their two spots into one. The hide of a cow is represented by an N by M (1 <= N,M <= 50) grid of characters like this:

................
..XXXX....XXX...
...XXXX....XX...
.XXXX......XXX..
........XXXXX...
.........XXX....

Here, each ‘X’ denotes part of a spot. Two 'X’s belong to the same spot if they are vertically or horizontally adjacent (diagonally adjacent does not count), so the figure above has exactly two spots. All of the cows in FJ’s herd have exactly two spots.
FJ wants to use as little paint as possible to merge the two spots into one. In the example above, he can do this by painting only three
additional characters with 'X’s (the new characters are marked with '*'s below to make them easier to see).

................
..XXXX....XXX...
...XXXX*...XX...
.XXXX..**..XXX..
........XXXXX...
.........XXX....

Please help FJ determine the minimum number of new 'X’s he must paint in order to merge two spots into one large spot.

听说最近的流行趋势是牛皮上有两个斑点的奶牛,农场主约翰买下了整群的有两个斑点的奶牛。
不幸的是,流行趋势往往会迅速发生变化,目前最流行的时尚是只有一个斑点的奶牛!
FJ想用画的方法让他的每一头奶牛的两个斑点连在一起成为一个斑点,从而使他的牛群更时尚。奶牛的皮由一个n*m(1<=n,m<=50)的字符格子表示:

................
..XXXX....XXX...
...XXXX....XX...
.XXXX......XXX..
........XXXXX...
.........XXX....

这里,每一个’X’表示一个斑点的一部分。垂直或水平相邻(对角线相邻不在内)的两个’X’属于同一个斑点,所以上图正好有两个斑点。所有FJ的奶牛正好都只有两个斑点。
FJ希望使用尽可能少的油漆合并两个斑点为一个。在上面的例子中,他只要画三个附加的字符就可以做到这一点。
附加字符“X”(新的字符如下图中的*那样表示,很容易看到)。

................
..XXXX....XXX...
...XXXX*...XX...
.XXXX..**..XXX..
........XXXXX...
.........XXX....

请帮助FJ确定最少的画的点的数目从而能让两个斑点合并为一个。

输入
* Line 1: Two space-separated integers, N and M.
* Lines 2…1+N: Each line contains a length-M string of 'X’s and '.'s specifying one row of the cow hide pattern.

第1行:两个空格隔开的整数,N和M。
第2…1+N行:每行包含一个长度为M的字符串,只有’X’和’.'组成,表示一只奶牛的兽皮图案。

输出
* Line 1: The minimum number of new 'X’s that must be added to the input pattern in order to obtain one single spot.

第1行:最小的添加新的’X’字符的数目从而让两块斑点能合并为单一的一块斑点。

样例
输入

6 16
................
..XXXX....XXX...
...XXXX....XX...
.XXXX......XXX..
........XXXXX...
.........XXX....

输出

3

提示
INPUT DETAILS:
The pattern in the input shows a cow hide with two distinct spots, labeled 1 and 2 below:

................
..1111....222...
...1111....22...
.1111......222..
........22222...
.........222....

OUTPUT DETAILS:
Three 'X’s suffice to join the two spots into one:

................
..1111....222...
...1111X...22...
.1111..XX..222..
........22222...
.........222....

输入描述:
输入的奶牛兽皮图案有两块明显的斑点,用标签1和标签2分别如下表示:

................
..1111....222...
...1111....22...
.1111......222..
........22222...
.........222....

输出描述:
用三个’X’足够让两块斑点变成一块。

................
..1111....222...
...1111X...22...
.1111..XX..222..
........22222...
.........222....

题意:
一张图中有2个连通块,求把这2个连通块连到一起最少需要填充多少个点。

思路:
用dfs遍历其中一个连通块,打上标记来区分两个连通块。
根据标记分别存放两个连通块。
求分别属于两个连通块的点之间的曼哈顿距离(暴力循环),取最小值。

AC 代码:

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
#define map Mapint n,m;
int map[57][57];
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};void init(){//存图char c;for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){cin>>c;if(c=='X')map[i][j]=1;}}
}void dfs(int x,int y){//遍历1个连通块map[x][y]=2;//打标记for(int i=0;i<4;i++){if(map[ x+dx[i] ][ y+dy[i] ]==1){dfs(x+dx[i],y+dy[i]);}}
}struct node{int x,y;
};node pot1[2500],pot2[2500];//两个连通块
int p1,p2;void savepot(){//分别存两个连通块for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(map[i][j]==2){pot1[p1]={i,j};p1++;}else if(map[i][j]==1){pot2[p2]={i,j};p2++;}}}
}int mht(){//求两组点之间的曼哈顿距离,取最小值int min0=101,mht0;for(int i=0;i<p1;i++){for(int j=0;j<p2;j++){mht0=abs(pot1[i].x-pot2[j].x)+abs(pot1[i].y-pot2[j].y)-1;min0=min(mht0,min0);}}return min0;
}node first;
void findfirst(){//任意找一个点作为dfs的起始点for(int i=1;i<=n;i++){for(int j=1;j<=m;j++){if(map[i][j]==1){first={i,j};return;}}}
}int main(){cin>>n>>m;init();findfirst();dfs(first.x,first.y);savepot();int ans=mht();cout<<ans;return 0;
}

USACO 2011 Nov. [Bronze] P4. Cow Beauty Pageant相关推荐

  1. USACO 2007 NOV Sunscreen 防晒霜 贪心

    题目 题目描述 To avoid unsightly burns while tanning, each of the C (1 ≤ C ≤ 2500) cows must cover her hid ...

  2. USACO January 2014 Bronze Level

    当时没参加silver的比赛,今天就只是想熟悉一下python的语法(以前都用最熟悉的C++写),于是水了一下Bronze level的题目. A:最后的结果肯定是在[begin, begin+17] ...

  3. 2014.3 USACO月赛T2 The Lazy Cow

    T2: The Lazy Cow Description 夏天很热,贝茜越发地懒散了.她想要使自己位于她的田里一个尽可能在短距离内够到美味的青草的位置. 贝茜居住的田野被描述为一个N 乘N 方格组成的 ...

  4. [USACO 2014 Jan Bronze]滑雪训练课程题解

    ..开始做usaco的题目.. 先来一道铜组的切切.. 某人: "你们如果要做USACO就要做金组和银组里面最难的,其它都太水了,做了没有益处.." 可以我太水了....只会做铜组 ...

  5. bzoj4278[ONTAK2015]Tasowanie bzoj1692[USACO 2007Dec]队列变换(Best Cow Line) 贪心正确性证明...

    做法网上到处都有就不说了. 这题其实是之前做的-.不过由于人太傻现在才想明白比较字典序进行贪心的正确性-. 方便起见,在两个串的最右端都加上很大但不相同的字符,避免第lcp+1个字符不存在的边界. 如 ...

  6. BZOJ2017[USACO 2009 Nov Silver 1.A Coin Game]——DP+博弈论

    题目描述 农夫约翰的奶牛喜欢玩硬币游戏,因此他发明了一种称为"Xoinc"的两人硬币游戏. 初始时,一个有N(5 <= N <= 2,000)枚硬币的堆栈放在地上,从堆 ...

  7. BZOJ 1232 USACO 2008 Nov. 安慰奶牛Cheer

    [题解] 对于每一条边,我们通过它需要花费的代价是边权的两倍加上这条边两个端点的点权. 我们把每条边的边权设为上述的值,然后跑一边最小生成树,再把答案加上最小的点权就好了. 1 #include< ...

  8. 【USACO 2.3.4】Cow Tours 牛的旅行

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧场通过任何路径都不连通.这样,Farmer John就有多个 ...

  9. 刷题记录:牛客NC24608[USACO 2011 Ope S]Learning Languages

    传送门:牛客 题目描述: [USACO11OPEN]Learning Languages S 农夫约翰的 N ( 2 < = N < = 10 , 000 ) N(2<=N<= ...

最新文章

  1. python中filenotfounderror_Python3 报错 FileNotFoundError: [WinError 2]
  2. 操作无法完成后台打印程序无法运行
  3. Android Studio 编译单个module
  4. 音视频互动开发平台之AnyChat SDK
  5. oracle语法垃圾,oracle 语法
  6. python.freelycode.com-Python中的并行处理 -- 实例编程指南
  7. DHCP服务器是什么?-Vecloud
  8. 关于 SAP Spartacus SSR 服务器返回的响应是否应该被缓存的问题
  9. oracle dw报告,讲解Oracle数据库的全文索引设置步骤
  10. 最后一周|高级转录组分析和R语言数据可视化第十二期 (线上线下同时开课)...
  11. Jquery 获取 radio选中值(转)
  12. 数据结构专题(二):2.5在链表指定位置插入元素
  13. VMware workstation9 Virtual Machine Network
  14. 使用 powershell 的 grep 过滤文本
  15. mysql update textl类型_MySQL 字段类型参考
  16. 点云数据文件常用格式及PCL中点云数据类型
  17. 轻微课好不好?来自轻微课校友的成才经历自述。
  18. python中exchange函数使用_Python下使用rabbitmq之exchange属性
  19. HDU - 6438 优先队列,+贪心。
  20. python给图片加半透明水印_图片添加半透明文字水印 Python

热门文章

  1. 微信小程序自动化框架minium实践,手把手带你玩minium
  2. Eureka开启密码认证
  3. Python编程语言学习:仅需一行代码将字符串化的数字数组、int数组、float数组实现之间互换(将一个字符串数组转换成整型数组)
  4. 一张图看懂 USDT三种类型地址 Omni、ERC20、TRC20的区别
  5. mysql s 什么意思_什么会降低MySqls的表现?
  6. 【归纳法】电脑文件整理的一种方案
  7. oracle中会话和连接数的简单分析
  8. 2022年考研结果已出,你上岸了吗?
  9. linux的swapper_pg_dir
  10. 关于金山词霸的屏幕取词3