2060. 奶牛选美
作者 : Xia Xinyu
日期 : 2022-1-3原题链接
听说最近两斑点的奶牛最受欢迎,约翰立即购进了一批两斑点牛。
不幸的是,时尚潮流往往变化很快,当前最受欢迎的牛变成了一斑点牛。
约翰希望通过给每头奶牛涂色,使得它们身上的两个斑点能够合为一个斑点,让它们能够更加时尚。
牛皮可用一个 N×M 的字符矩阵来表示,如下所示:
…
…XXXX…XXX…
…XXXX…XX…
.XXXX…XXX…
…XXXXX…
…XXX…
其中,X 表示斑点部分。
如果两个 X 在垂直或水平方向上相邻(对角相邻不算在内),则它们属于同一个斑点,由此看出上图中恰好有两个斑点。
约翰牛群里所有的牛都有两个斑点。
约翰希望通过使用油漆给奶牛尽可能少的区域内涂色,将两个斑点合为一个。
在上面的例子中,他只需要给三个 . 区域内涂色即可(新涂色区域用 ∗ 表示):
…
…XXXX…XXX…
…XXXX*…XX…
.XXXX…**…XXX…
…XXXXX…
…XXX…
请帮助约翰确定,为了使两个斑点合为一个,他需要涂色区域的最少数量。
输入格式
第一行包含两个整数 N 和 M。
接下来 N 行,每行包含一个长度为 M 的由 X 和 . 构成的字符串,用来表示描述牛皮图案的字符矩阵。
输出格式
输出需要涂色区域的最少数量。
数据范围
1≤N,M≤50
输入样例:
6 16
…
…XXXX…XXX…
…XXXX…XX…
.XXXX…XXX…
…XXXXX…
…XXX…
输出样例:
3
思路:推导出最优解一定可以用曼哈顿距离公式求出(反证法)
import java.util.*;class Main{static int[] dx = {1,0,-1,0}; //下右上左static int[] dy = {0,1,0,-1};static char[][] g = new char[60][60];static int n,m;public static void dfs(int x,int y,List<Pair> l){g[x][y] = '.';for(int i = 0; i < 4; i ++){int aa = x + dx[i],bb = y + dy[i];if(aa >= 0 && aa < n && bb >= 0 && bb < m && g[aa][bb] == 'X'){l.add(new Pair(aa,bb));dfs(aa,bb,l);}}}public static void main(String[] args){Scanner in = new Scanner(System.in);n = in.nextInt();m = in.nextInt();for(int i = 0; i < n; i ++){g[i] = in.next().toCharArray();}List<Pair> a = new ArrayList<>();List<Pair> b = new ArrayList<>();boolean flag = false;//搜第一个连通块for(int i = 0; i < n; i ++){for(int j = 0; j < m; j ++){if(g[i][j] == 'X'){a.add(new Pair(i,j));dfs(i,j,a);flag = true;break;}}if(flag)break;}//搜第二个连通块for(int i = 0; i < n; i ++){for(int j = 0; j < m; j ++){if(g[i][j] == 'X'){b.add(new Pair(i,j));dfs(i,j,b);}}}// System.out.println(a.size());// System.out.println(b.size());int res = (int)2e9;for(Pair x : a){for(Pair y : b){res = Math.min(res,Math.abs(x.x - y.x) + Math.abs(x.y - y.y));}}System.out.println(res - 1);}
}
class Pair {int x;int y;public Pair(int x,int y){this.x = x;this.y = y;}
}
2060. 奶牛选美相关推荐
- 寒假每日一题2022【week1 完结】
目录 2058. 笨拙的手指[枚举] 2041. 干草堆[差分] 2060. 奶牛选美[dfs + 思维] 2019. 拖拉机[双端队列] 2014. 岛[思维+离散化] 2005. 马蹄铁[dfs] ...
- AcWing2022寒假每日一题(1 月 2 日 ~ 1 月 15 日)
目录 1/2 AcWing 2058. 笨拙的手指 1/3 (前缀和)AcWing 2041. 干草堆 1/4 (dfs暴力枚举)AcWing 2060. 奶牛选美 1/5 (bfs)AcWing 2 ...
- AcWing2022寒假每日一题(1 月 2 日 ~ 1 月 6 日)
目录 1/2 AcWing 2058. 笨拙的手指 1/3 AcWing 2041. 干草堆 1/4 AcWing 2060. 奶牛选美 1/5 AcWing 2019. 拖拉机 1/6 AcWing ...
- AcWing寒假每日一题2022-第1周
week 1: 2058.笨拙的手指 2041.干草堆 2060.奶牛选美 2019.拖拉机 2014.岛 2058.笨拙的手指 一.问题描述 奶牛贝茜正在学习如何在不同进制之间转换数字.但是她总是犯 ...
- ZOJ 2723 Semi-Prime ||ZOJ 2060 Fibonacci Again 水水水!
两题水题: 1.如果一个数能被分解为两个素数的乘积,则称为Semi-Prime,给你一个数,让你判断是不是Semi-Prime数. 2.定义F(0) = 7, F(1) = 11, F(n) = F( ...
- HIT 2060 Fibonacci Problem Again
点击此处即可传送HIT 2060 As we know , the Fibonacci numbers are defined as follows: F(n) == {1 n==0||n==1{F( ...
- 2060. 同源字符串检测
2060. 同源字符串检测 原字符串由小写字母组成,可以按下述步骤编码: 任意将其 分割 为由若干 非空 子字符串组成的一个 序列 . 任意选择序列中的一些元素(也可能不选择),然后将这些元素替换为元 ...
- 信息学奥赛一本通 2060:【例1.1】计算机输出
[题目链接] ybt 2060:[例1.1]计算机输出 [题目考点] 1. 输出字符串 cout << 字符型常量; printf(字符型常量); [题解代码] 解法1: #include ...
- 信息学奥赛一本通(2060:【例1.1】计算机输出)
2060:[例1.1]计算机输出 时间限制: 1000 ms 内存限制: 65536 KB 提交数: 597 通过数: 424 [题目描述] 在屏幕上输出"Hello ...
- 1971旗舰cpu intel_Intel 酷睿i7 9700F搭配影驰GeForce RTX 2060大将
Intel 酷睿i7 9700F搭配影驰GeForce RTX 2060 大将台式电脑搭配方案 作为次旗舰的代表,8700K的升级产品,9700F提升了睿频,采用了八核心八线程设计,主频3GHz,最大 ...
最新文章
- 加权最小二乘法的原理讲解
- python requests库详解_python的requests库详解
- 职场中神奇的程序员,却常常被人说“太直”,这是什么样的思维?
- TBXML常用API
- C语言函数声明与定义(待删除)
- mysql 查询关键词顺序
- 世界杯座位选择顺序总数
- MT6737模块编译方法
- Win7系统如何在线进行重装?在线一键重装Win7方法
- 计算机毕业设计JavaVue.js音乐播放器设计与实现(源码+系统+mysql数据库+lw文档)
- 一文搞懂“如何通过群晖+DNSPod DDNS搭建私有云服务?”
- 技术变现第一步:网站快速接入国际支付 Stripe
- iphone 投屏到android,苹果安卓手机投屏之(二)——音频文件在电视上播放
- 距离2021年还剩75天,我在想什么?
- Hollo world
- vue 使用vue-i18n 实现多语系(国际化)
- 计算机图形学入门(一)-线性代数部分知识1
- pkpm快速入门教程_PKPM结构软件从入门到精通高清版
- mysql查询当月数据_MySQL查询当天当月数据 | 小灰灰博客
- 10bit显示器测试软件,LAPAELO 32寸 4k 10bit面板 显示器 简单测试