2060.奶牛选美

2060.奶牛选美Acwing2060 奶牛选美

Powered by:NEFU AB-IN

Link

2060.奶牛选美

  • 2060

    题意

  • 思路

    • 双端队列广搜
      随意挑选出一个X点作为起点,点为.时点权为1,点为X时点权为0,当遍历到某个X且距离不为0时结束,此时为最短
      因为此时肯定是到了与起点不一样的连通块,而且是求最短路时最先到的,所以是最短距离
      复杂度为线性






    • Floyd fill
      一共有两个连通块,那么先用Floyd fill
      • BFS
      • DFS
        将两个连通块的所有点全部标记出来
        最后算距离时,枚举两个集合的所有点,求两个点的曼哈顿距离-1,即是答案,复杂度 O ( n 2 ) O(n^2) O(n2)





    对于距离最近的两个点,最近的距离为曼哈顿距离

  • 代码

    • ''' Author: NEFU AB-IN Date: 2022-01-29 18:26:56 FilePath: \ACM\Acwing\2060.2.py LastEditTime: 2022-01-29 19:12:51 ''' from collections import deque N = 55 INF = int(2e9) g = [] dist = [[INF for _ in range(N)] for _ in range(N)] st = [[0 for _ in range(N)] for _ in range(N)] dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1] def bfs(sx, sy): global n, m q = deque() q.append([sx, sy]) dist[sx][sy] = 0 while len(q): t = q.pop() if st[t[0]][t[1]]: continue st[t[0]][t[1]] = 1 if g[t[0]][t[1]] == 'X' and dist[t[0]][t[1]] > 0: return dist[t[0]][t[1]] for i in range(4): x = t[0] + dx[i] y = t[1] + dy[i] if x >= 0 and x < n and y >= 0 and y < m: w = 0 if g[x][y] == '.': w = 1 if dist[x][y] > dist[t[0]][t[1]] + w: dist[x][y] = dist[t[0]][t[1]] + w if w == 0: q.append([x, y]) else: q.appendleft([x, y]) if __name__ == "__main__": n, m = map(int, input().split()) for i in range(n): s = input() g.append(list(s)) for i in range(n): for j in range(m): if g[i][j] == 'X': print(bfs(i, j)) exit(0) 
    • BFS 1502ms

      代码长,不容易爆栈,可以求最短路

      ''' Author: NEFU AB-IN Date: 2022-01-17 22:29:48 FilePath: \ACM\Acwing\2060.1.py LastEditTime: 2022-01-17 23:07:00 ''' #BFS from collections import deque class Point(object): def __init__(self, x, y): self.x = x self.y = y n, m = map(int, input().split()) g = [] vis = [[0 for _ in range(m + 1)] for _ in range(n + 1)] point = [[] for _ in range(2)] dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1] # 上右下左 q = deque() def bfs(x, y, p): vis[x][y] = 0 p.append(Point(x, y)) q.appendleft(Point(x, y)) #左进 while q.__len__(): top = q.pop() #右出 x = top.x y = top.y for i in range(4): xx = x + dx[i] yy = y + dy[i] if xx >= 0 and yy >= 0 and xx < n and yy < m and vis[xx][yy] == 1: q.appendleft(Point(xx, yy)) p.append(Point(xx, yy)) vis[xx][yy] = 0 if __name__ == "__main__": for i in range(n): s = input() g.append(list(s)) for j in range(len(s)): vis[i][j] = 1 if g[i][j] == 'X' else 0 k = 0 for i in range(n): for j in range(m): if vis[i][j] == 1: bfs(i, j, point[k]) k += 1 res = int(2e9) for i in point[0]: for j in point[1]: res = min(res, abs(i.x - j.x) + abs(i.y - j.y) - 1) print(res) # 2,6 # 4,8 
    • DFS 1152ms

      代码短,容易爆栈,无法求最短路
      由于python自己设置了递归层数,所以需要手动修改!!

      ''' Author: NEFU AB-IN Date: 2022-01-17 20:05:02 FilePath: \ACM\Acwing\2060.py LastEditTime: 2022-01-17 22:31:33 ''' # DFS import sys # python设置了默认迭代次数,如果不用以下导入的话,最大迭代次数1e3级别,dfs无法正常运行 sys.setrecursionlimit() class Point(object): def __init__(self, x, y): self.x = x self.y = y n, m = map(int, input().split()) g = [] vis = [[0 for _ in range(m + 1)] for _ in range(n + 1)] point = [[] for _ in range(2)] dx = [-1, 0, 1, 0] dy = [0, 1, 0, -1] # 上右下左 def dfs(x, y, p): vis[x][y] = 0 p.append(Point(x, y)) for i in range(4): xx = x + dx[i] yy = y + dy[i] if xx >= 0 and yy >= 0 and xx < n and yy < m and vis[xx][yy] == 1: dfs(xx, yy, p) if __name__ == "__main__": for i in range(n): s = input() g.append(list(s)) for j in range(len(s)): vis[i][j] = 1 if g[i][j] == 'X' else 0 k = 0 for i in range(n): for j in range(m): if vis[i][j] == 1: dfs(i, j, point[k]) k += 1 res = int(2e9) for i in point[0]: for j in point[1]: res = min(res, abs(i.x - j.x) + abs(i.y - j.y) - 1) print(res) 

    双端队列广搜 1452ms

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

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

(0)
上一篇 2026年3月19日 下午5:25
下一篇 2026年3月19日 下午5:25


相关推荐

  • QAction类详解

    QAction类详解nbsp nbsp nbsp nbsp nbsp QAction 类提供了抽象的用户界面 action 这些 action 可以被放置在窗口部件中 nbsp nbsp nbsp nbsp 应用程序可以通过菜单 工具栏按钮以及键盘快捷键来调用通用的命令 由于用户期望每个命令都能以相同的方式执行 而不管命令所使用的用户界面 这个时候使用 action 来表示这些命令就显得十分有用 nbsp nbsp nbsp nbsp nbsp Actions 可以被添加到菜单和工具栏中 并且可以自动保持在

    2026年3月19日
    3
  • 三门问题详解(附C语言实现)

    三门问题详解(附C语言实现)三门问题 违背直觉的概率现象 nbsp nbsp 三门问题 MontyHallpro 亦称为蒙提霍尔问题 蒙特霍问题或蒙提霍尔悖论 大致出自美国的电视游戏节目 Let sMakeaDeal 问题名字来自该节目的主持人蒙提 霍尔 MontyHall 参赛者会看见三扇关闭了的门 其中一扇的后面有一辆汽车 选中后面有车的那扇门可赢得该汽车 另外两扇门后面则各藏有一只山羊 当参赛者选定了一扇门 但未去开启它的时候 节目主持人开启剩下两扇门的其中一扇 露出其中一只山羊 主持人其后会问参赛者要

    2026年3月19日
    1
  • AJAX通讯加密[通俗易懂]

    AJAX通讯加密[通俗易懂]前端HTML&lt;!DOCTYPEhtml&gt;&lt;html&gt;&lt;head&gt;&lt;metacharset="UTF-8"&gt;&lt;title&gt;AJAXbase64加密通讯实例&lt;/title&gt;&lt;scripttype="text/javascript"src="js/base64

    2022年6月7日
    32
  • java常见面试题及答案 11-20(JVM)

    11.JVM内存分哪几个区,每个区的作用是什么?java虚拟机主要分为以下一个区:方法区:1.有时候也成为永久代,在该区内很少发生垃圾回收,但是并不代表不发生GC,在这里进行的GC主要是对方法区里的常量池和对类型的卸载2.方法区主要用来存储已被虚拟机加载的类的信息、常量、静态变量和即时编译器编译后的代码等数据。3.该区域是被线程共享的。4.方法区里有

    2022年4月13日
    33
  • 加工机械双探头高频读写器CK-FR102AN用户开发手册「建议收藏」

    加工机械双探头高频读写器CK-FR102AN用户开发手册「建议收藏」加工机械双探头高频读写器CK-FR102AN用户开发手册CK-FR102AN系列双探头高频读写器是一款基于射频识别技术的高频RFID标签读卡器,读卡器工作频率为13.56MHZ,支持对I-CODE2、I-CODESLI等符合ISO15693国际标准协议格式标签的读取。FR102一款轻量型RFID读头,采用菲尼克斯定制外壳,体积小、自带工控箱安装滑轨卡扣,易安装。同时支持两个探头工作,通过电缆拉长的探头在加工机械应用场景上可以灵活安装,支持姆龙plc的ethernetip通讯。读写器选型型号

    2022年6月22日
    31
  • PHP smarty

    PHP smarty<?php/*一、什么是smarty?smarty是一个使用PHP写出来的模板PHP模板引擎,它提供了逻辑与外在内容的分离,简单的讲,目的就是要使用PHP程序员同美工分离,使用的程序员改变程序的

    2022年7月1日
    25

发表回复

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

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