1. 问题描述:

干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了。他的奶牛非常调皮,决定对约翰来场恶作剧。她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些干草捆。拖拉机的位置以及 N 捆干草的位置都是二维平面上的整数坐标点。拖拉机的初始位置上没有干草捆。当约翰驾驶拖拉机时,他只能沿平行于坐标轴的方向(北,南,东和西)移动拖拉机,并且拖拉机必须每次移动整数距离。例如,驾驶拖拉机先向北移动 2 单位长度,然后向东移动 3 单位长度。拖拉机无法移动到干草捆占据的位置。请帮助约翰确定他需要移除的干草捆的最小数量,以便他能够将拖拉机开到二维平面的原点。

输入格式

第一行包含三个整数:N 以及拖拉机的初始位置 (x,y)。接下来 N 行,每行包含一个干草捆的位置坐标 (x,y)。

输出格式

输出约翰需要移除的干草捆的最小数量。

数据范围

1 ≤ N ≤ 50000,
1 ≤ x,y ≤ 1000

输入样例:

7 6 3
6 2
5 2
4 3
2 1
7 3
5 4
6 4

输出样例:

1
来源:https://www.acwing.com/problem/content/description/2021/

2. 思路分析:

首先我们需要读懂题目的意思,题目实际上是给出了一个无限大的二维矩阵,矩阵中有N个位置是有干草的,可以看成是障碍物,拖拉机可以看成是起点,终点为原点,我们需要求解从起点到终点的最短距离,也即需要移开的最少障碍物的数量,由这些特点可以知道为最短路径模型,存在障碍物可以将权重看成是1,否则看成是0所以实际上是边权只有0和1的的单源最短路径模型,边权只有0或者1的最短路径问题可以使用双端队列广搜来解决,单源最短路径可以看成是dijkstra算法的简化版本,因为题目中的矩阵是无限大的,而我们在搜索的时候不可能是搜索无限大的,障碍物的位置为1~1000,所以我们可以在扩展的多扩展一圈或者多扩展几个位置那么就可以了,扩展的这些位置都是没有障碍物的,对于最短路径是没有影响的,这样就可以将搜索的范围控制在0~1010之内了,双端队列广搜类似于堆优化版的dijkstra算法需要借助于一个距离数组dis,用来记录从起点到某个点的最短距离,vis数组用来判重,由于某个点可能入队多次所以应该是在出队的时候进行判重,使用双端队列广搜的模板解决即可。

3. 代码如下:

import collections
from typing import Listclass Solution:# 双端队列广搜: 堆优化版的dijkstra算法的简化版本def bfs(self, sx: int, sy: int, g: List[List[int]]):N = 1010INF = 10 ** 10# dis记录从起点到终点的最短距离dis = [[INF] * N for i in range(N)]q = collections.deque([(sx, sy)])dis[sx][sy] = 0# 判重列表vis = [[0] * N for i in range(N)]# 右左下上四个方向pos = [[0, 1], [0, -1], [1, 0], [-1, 0]]while q:x, y = q.popleft()if x == 0 and y == 0: break# 出队的时候判重if vis[x][y] == 1: continuevis[x][y] = 1for i in range(4):a, b = x + pos[i][0], y + pos[i][1]if 0 <= a < N and 0 <= b < N:w = g[a][b]if dis[a][b] > dis[x][y] + w:dis[a][b] = dis[x][y] + w# 边权为1加入到队尾if w:q.append((a, b))# 否则加入到队头else:q.appendleft((a, b))return dis[0][0]def process(self):# n表示障碍物的数量, sx, sy表示起点坐标n, sx, sy = map(int, input().split())N = 1010g = [[0] * N for i in range(N)]for i in range(n):x, y = map(int, input().split())g[x][y] = 1return self.bfs(sx, sy, g)if __name__ == '__main__':print(Solution().process())

2019 拖拉机(双端队列广搜)相关推荐

  1. 【双端队列广搜/搜索+图论】AcWing 2019.拖拉机 USACO 2012 March Contest Silver Division

    [题目描述] 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了 NNN 捆干草,这样一来,约翰想要开走拖拉机就必须先移除 ...

  2. AcWing 342. 道路与航线 (双端队列广搜问题,SPFA)

    题目描述 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航线 (编号为1到P) 连接. 每条道路i ...

  3. 算法提高课-搜索-双端队列广搜-AcWing 175. 电路维修:deque、bfs、有点难

    题目分析 来源:acwing 只有边权为0和边权为1,两种情况.什么意思呢?两个点之间存在路径则边权为0,需要转一下连通的边权为1. 每个点可能入队多次,本质上是个dijkstra算法. 下图说明bf ...

  4. 多源BFS-双端队列广搜

    多源BFS AcWing173. 矩阵距离 给定一个N行M列的01矩阵A,A[i][j]A[i][j]A[i][j] 与 A[k][l]A[k][l]A[k][l] 之间的曼哈顿距离定义为: dist ...

  5. 双端队列BFS:拖拉机

    原题链接:https://www.acwing.com/problem/content/2021/ 一个裸的双端队列广搜. #include <iostream> #include < ...

  6. AcWing 2019. 拖拉机(双端队列BFS)

    [题目描述] 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了NNN捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些 ...

  7. LeetCode 641. 设计循环双端队列

    文章目录 1. 题目信息 2. 解题 1. 题目信息 设计实现双端队列. 你的实现需要支持以下操作: MyCircularDeque(k):构造函数,双端队列的大小为k. insertFront(): ...

  8. C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划

    C++数据结构和算法2 栈 双端/队列 冒泡选择插入归并快排 二三分查找 二叉树 二叉搜索树 贪婪 分治 动态规划 博文末尾支持二维码赞赏哦 _ github 章3 Stack栈 和 队列Queue= ...

  9. 数据结构与算法(Python版) | (6) 线性结构---队列、双端队列和列表

    本专栏主要基于北大的数据结构与算法教程(Python版)进行整理,包括课程笔记和OJ作业. 课程链接 1. 队列抽象数据类型及Python实现 什么是队列? 队列是一种有次序的数据集合,其特征是: 1 ...

最新文章

  1. oracle job的迁移
  2. linux判断网卡是否挂载,检查网卡是否加载 - Linux服务器网卡驱动安装及故障排除_服务器应用_Linux公社-Linux系统门户网站...
  3. 在CentOS 5.5下用OpenSSH构建SSH服务器(上)
  4. SQL Server-聚焦UNIOL ALL/UNION查询(二十三)
  5. 快照设计 电商系统_电商系统设计之购物车
  6. 三维重建6:绑架问题/SensorFusion/IMU+CV-小尺度SLAM
  7. 将Spring MVC RESTful Web服务迁移到Spring 4
  8. 碎玻璃:诊断生产Cassandra问题
  9. 资料下载丨“十四五”数据库发展趋势与挑战-CCF数据库专委会
  10. SpringCloud feign、hystrix、zuul超时配置
  11. DIV默认高度且自适应高度
  12. 树莓派命令行发送邮件
  13. NHibernate N+1问题实例分析和优化
  14. 小米工作室AIoT开发平台高校创新赛报名启动
  15. 云存储安全,主要面临哪些问题
  16. 戴尔台式计算机usb驱动,dell服务器和电脑不支持usb2.0设备安装系统的解决方案方法...
  17. 最新IT段子手详解MyBatis遇到Spring 秒学Java SSM开发大众点评 难度中级
  18. 织梦如何添html5播放器,织梦ckplayer视频播放器插件的介绍与使用
  19. (01)开发环境准备
  20. Hierarchical Z-Buffer Visibility (Hi-Z)

热门文章

  1. 【SSH进阶之路】Hibernate基本映射(三)
  2. ESP32 Arduino Ticker定时库
  3. 计算机系统维护工作内容
  4. win10计算机里文件夹怎么删除文件,电脑文件夹删不掉怎么办(win10家庭版文件夹如何加密)...
  5. Python导入数据
  6. 如何写使用说明书或使用手册
  7. 贴近摄影测量 | 重建花山岩画只需两步!
  8. Mysql语法大全(命令行)(简洁、明了、全面)
  9. 保弘实业|理财要有合理的计划
  10. 当我们谈深度学习时,我们用它落地了什么?阿里云内容安全功能全新升级