acwing2060.奶牛选美

acwing2060.奶牛选美目录 1 题目描述 2 题目思路 3 dfs 求曼哈顿距离 c 题解 1 题目描述题意简写 给出两块彼此不连通的斑点 要求将这两块斑点连起来所需要涂的最少的点 涂点的时候只能沿着 x 方向和 y 方向来涂 并且只有对角线的斑点接触的时候不叫连通 只有 xy 其中一个方向的斑点紧靠在一起才叫联通 2 题目思路首先我们先来了解一下曼哈顿距离 两点之间的 x 坐标之差的绝对值加上 y 坐标值差的绝对值 数学表达式表述为 d i j X1 X2 Y1 Y2 所以本题求的

目录

1.题目描述

2.题目思路

3.dfs+求曼哈顿距离 c++题解


1.题目描述

acwing2060.奶牛选美

acwing2060.奶牛选美

 题意简写:给出两块彼此不连通的斑点,要求将这两块斑点连起来所需要涂的最少的点,涂点的时候只能沿着x方向和y方向来涂,并且只有对角线的斑点接触的时候不叫连通,只有xy其中一个方向的斑点紧靠在一起才叫联通。

2.题目思路

首先我们先来了解一下曼哈顿距离:两点之间的x坐标之差的绝对值加上y坐标值差的绝对值,数学表达式表述为   

d(i,j)=|X1-X2|+|Y1-Y2|.

所以本题求的其实就是两块斑点集合中分别在两边取两点之间所有的曼哈顿距离的最小值

首先来看以下例子,假设构造出两块斑点,现在要涂上最少的格子使他们连通。蓝色和红色都表示奶牛原有的斑点,蓝色代表在两块集合中随机选中的两个点:

acwing2060.奶牛选美

 假设这两个蓝色方块之间的曼哈顿距离就是所需要涂的最短距离,现在我们构造一条曼哈顿路径,沿着黄色与黑色方块从左边的蓝色方块走到右边的黑色方块,如图:

acwing2060.奶牛选美

这时我们发现,这个假设是不成立的,因为他的路径上出现了“障碍物”(黑色方块),这时我们可以很明显地看到黑色方块之间的曼哈顿距离更短,所以黑色方块之间的曼哈顿距离更有可能是涂的最少的路径选择。

现在我们来简化总结一下模型如图:

acwing2060.奶牛选美

这就好比4个人走一条路,其中的两个人(黑色方块)在另外两个人(蓝色方块)的路径中间彼此靠近,那么正由于他们位于路径中间少走了一小段路,所以它们之间需要走的距离必然少于两个端点的人之间相互靠近所需要走的距离。

所以这个模型的本质就是:路径中间如果途径了障碍物,那必然存在比两起点之间曼哈顿距离更短的选择

所以我们返回这道题,这个模型推演的结果就是找出两个集合之间存在的最小曼哈顿距离

因此我们需要利用dfs或者bfs先将两个集合的斑点坐标保存下来,再暴力搜索两个集合,求出位于不同斑点集合中的每两个点之间的曼哈顿距离,取最小值。

为什么需要用dfs或者bfs,因为只有他们才能做到范围式的搜索,题中遇到 ‘ .’就必须停止搜索,从而避免了存储另外一个斑点块的数据,而顺序搜索很明显不能实现这一点。

3.dfs+求曼哈顿距离 c++题解

#include 
   
     #include 
    
      #include 
     
       using namespace std; int n, m; /*定义斑点整个图的行列大小*/ const int N = 55; char g[N][N];/*存储斑点整个图的集合*/ vector 
      
        >p[2]; /* p存储两个不连通的的斑点块的斑点点的坐标,一共有两个斑点块*/ int x[4] = { 0, 1, -1, 0 }, y[4] = { -1, 0, 0, 1 }; void dfs(int a, int b, vector 
       
         >&pp) /*深度优先遍历,将深度搜索到的两块斑点集合分别保存下来*/ { g[a][b] = '.'; /*这里采用的是不重复搜索的dfs,才能保证存储的集合点不重复*/ pp.push_back({ a, b }); for (int i = 0; i<4; i++) { int k = a + x[i],l = b + y[i]; /*对上下左右四个不同方向做dfs*/ if (k >= 0 && k 
        
          = 0 && l 
         
           > n >> m; for (int i = 0; i 
          
            > g[i]; /*输入奶牛斑点的数据图*/ for (int i = 0,k=0; i 
            
           
          
         
        
       
      
     
   

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/222515.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午3:37
下一篇 2026年3月17日 下午3:38


相关推荐

  • eclipse代码自动补全[通俗易懂]

    eclipse代码自动补全[通俗易懂]1、点击菜单栏,打开Eclipse->Window->Perferences2、找到Java下的 Editor下的 ContentAssist,点击它3、找到第二个“AutoactivationtriggersforJava:”选项,在其后的文本框中会看到一个“.”存在。这表示:只有输入“.”之后才会有代码提示和自动补全,把该文本框中的“.”换成“abcdefghijklmnopqrstuvwxyz.”即可。…

    2022年5月31日
    39
  • n8n+crawl4ai工作流,一键抓取任意网站!搭建RAG知识库+MCP自动化,让你的AI更准!更强!

    n8n+crawl4ai工作流,一键抓取任意网站!搭建RAG知识库+MCP自动化,让你的AI更准!更强!

    2026年3月15日
    1
  • FIST! FIST! FIST! Its all in the wrist: Remote Exec[通俗易懂]

    FIST! FIST! FIST! Its all in the wrist: Remote Exec[通俗易懂]==PhrackInc.==Volume0x0b,Issue0x3e,Phile#0x08of0x10|=—–=[FIST!FIST!FIST!Itsallint

    2022年8月5日
    6
  • static作用(修饰函数、局部变量、全局变量)

    static作用(修饰函数、局部变量、全局变量)C 语言 static 作用 修饰函数 局部变量 全局变量 一 static 全局变量与普通的全局变量有什么区别 全局变量 外部变量 的说明之前再冠以 static 就构成了静态的全局变量 nbsp 全局变量本身就是静态存储方式 静态全局变量当然也是静态存储方式 这两者在存储方式上并无不同 nbsp 这两者的区别在于非静态全局变量的作用域是整个源程序 当一个源程序由多个源文件组成时 非静态的全局变

    2026年3月17日
    3
  • DNS负载均衡技术

    DNS负载均衡技术负载均衡技术能够平衡服务器集群中所有的服务器和请求应用之间的通信负载,根据实时响应时间进行判断,将任务交由负载最轻的服务器来处理,以实现真正的智能通信管理和最佳的服务器群性能,从而使网站始终保持运行和保证其可访问性。  为了充分利用现有服务器软件的种种优势,负载均衡最好是在服务器软件之外来完成。而最早使用的负载均衡技术是通过DNS服务中的随机名字解析来实现的。这就是通常所说的DNS负载均衡

    2022年7月14日
    17
  • hw1-浅谈Dota2设计元素

    hw1-浅谈Dota2设计元素今年的 TI9 赛事在中国上海举行 可谓是 Dota2 玩家们的一大幸事 但是 LGD 战队止步于季军 也让我们的粉丝心凉了一截 8 月 25 日 OG 战队以 3 比 1 战胜 Liquid 战队 将 2019Dota2 国际邀请赛冠军收入囊中 实现了在该项赛事的卫冕 TI 作为 Dota2 国际邀请赛 是该项目的最高等级赛事 受到了全世界的关注 这也说明了 Dota2 有强大的吸引力 到底它的游戏元素是什么样的呢 我们一起来看一下吧

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号