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

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

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

【数据范围】
1≤N≤500001≤N≤500001≤N≤50000
1≤x,y≤10001≤x,y≤10001≤x,y≤1000

【输入样例】

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

【输出样例】

1

【分析】


使用双端队列BFS,若走到空地上,则距离+0+0+0,并加入到队列头部;若走到干草捆上,则距离+1+1+1,并加入到队列尾部。由于干草捆的坐标范围是1≤x,y≤10001≤x,y≤10001≤x,y≤1000,终点为(0,0)(0,0)(0,0),因此是可以走出1∼10001\sim 10001∼1000这个坐标范围的,范围之外全是空地,因此我们搜索的时候需要至少将搜索范围扩展至0∼10010\sim 10010∼1001,继续扩展也没有意义了。


【代码】

#include <iostream>
#include <cstring>
#include <algorithm>
#include <deque>
using namespace std;typedef pair<int, int> PII;
const int N = 1010;
bool g[N][N], st[N][N];
int dis[N][N];
int n, sx, sy;
int dx[4] = { -1, 0, 1, 0 }, dy[4] = { 0, 1, 0, -1 };int bfs(int sx, int sy)
{memset(dis, 0x3f, sizeof dis);deque<PII> Q;Q.push_back({ sx, sy });dis[sx][sy] = 0;while (Q.size()){auto t = Q.front();Q.pop_front();int x = t.first, y = t.second;if (!x && !y) break;if (st[x][y]) continue;st[x][y] = true;for (int i = 0; i < 4; i++){int nx = x + dx[i], ny = y + dy[i];if (nx >= 0 && nx < N && ny >= 0 && ny < N && dis[x][y] + g[nx][ny] < dis[nx][ny]){dis[nx][ny] = dis[x][y] + g[nx][ny];if (g[nx][ny]) Q.push_back({ nx, ny });else Q.push_front({ nx, ny });}}}return dis[0][0];
}int main()
{cin >> n >> sx >> sy;while (n--) { int x, y; cin >> x >> y; g[x][y] = true; }cout << bfs(sx, sy) << endl;return 0;
}

AcWing 2019. 拖拉机(双端队列BFS)相关推荐

  1. 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS

    一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...

  2. 洛谷P1346 电车(双端队列BFS)

    [题目描述] 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关 ...

  3. 双端队列BFS:拖拉机

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

  4. 双端队列 BFS + Chamber of Secrets CodeForces - 173B

    题意: 一个 n×mn\times mn×m 的图,现在有一束激光从左上角往右边射出,每遇到 '#',你可以选择光线往四个方向射出,或者什么都不做,问最少需要多少个 '#' 往四个方向射出才能使光线在 ...

  5. 电路维修 -> 双端队列 BFS

    [问题描述] Elf是来自Gliese星球的少女,她有一辆飞行车.飞行车电路板的整体结构是一个R行C列的网格(R,C≤500),网格的交点都是电路板的接点,每个格子都包含一个电子元件.电子元件的主要部 ...

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

    题目链接 https://www.acwing.com/problem/content/2021/ 思路 一个有0代价和1代价边权的最短路,我们用双端队列将0和1边权用一个双端队列分开存储,然后进行一 ...

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

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

  8. 2019 拖拉机(双端队列广搜)

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

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

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

最新文章

  1. 松本行弘为什么要开发Ruby
  2. 查看有多少个linux用户登录,Linux用户查看系统有多少用户在登录
  3. 高等数学:第三章 微分中值定理与导数的应用(2)函数单调性 极值 最大值 最小值
  4. 关于 MySQL5.7.log 版本导出 SQL 语句再导入 8.0.13 版本出现 Incorrect datetime value: ‘0000-00-00 00:00:00‘ 错误的解决办法
  5. 作研究需要的绣花功夫
  6. MapReduce案例-wordcount-Reduce阶段代码
  7. 2021廊坊高考口试成绩查询,2021河北八省联考成绩查询入口
  8. 百度前端学院-基础学院-第四课
  9. python求解三元一次方程_北师大版八上数学5.2 求解二元一次方程组 知识点微课精讲...
  10. Oracle死锁情况
  11. ubuntn开发php教程,Ubuntu16.04的PHP开发环境配置
  12. docker hub mysql主从_使用 Docker Compose 搭建 MySQL 数据库主从复制实例
  13. Life is short, you need Python. ——Bruce Eckel
  14. 录音转文字 android,录音转文字pro
  15. 根据c语言标识符的命名规则 标识符只能由,二级C语言教程同步习题集答案解析1-2章.doc...
  16. 微信支付成功后发送短信通知
  17. 什么是等保(信息安全等级保护)?
  18. 【noiOJ】p7939
  19. 深入浅出React和Redux-程墨
  20. 分类效果评价(机器学习)

热门文章

  1. 检测笔记本电脑的主板,cpu,硬盘的温度
  2. 等保测评一体机是什么?由哪些安全模板组成?
  3. Wireshark TS | TCP Previous Segment Lost
  4. XMind基础教程-主题篇
  5. 在PB中存图片入数据库及显示图片
  6. Maven的几个常用Plugin
  7. 视频(mp4文件)批量转换成动图(gif文件)
  8. java实现屏幕自动截屏_使用Java实现静默屏幕截图
  9. vLive虚拟直播,助力企业打造线上云年会
  10. java怎样生成epub文件_使用Zip库创建Epub文件