AcWing 2019. 拖拉机(双端队列BFS)
【题目描述】
干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了。
他的奶牛非常调皮,决定对约翰来场恶作剧。
她们在田地的不同地方放了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)相关推荐
- 广度优先搜索BFS进阶(一):多源BFS、优先队列BFS、双端队列BFS
一.多源BFS 在上一篇博客:广度优先搜索BFS基础中,我们接触到的BFS均是单起点(单源)的,但是对于某一些问题,其有多个起点,此类问题我们称为多源BFS问题.先思考下面一道例题: 1.腐烂的橘子 ...
- 洛谷P1346 电车(双端队列BFS)
[题目描述] 在一个神奇的小镇上有着一个特别的电车网络,它由一些路口和轨道组成,每个路口都连接着若干个轨道,每个轨道都通向一个路口(不排除有的观光轨道转一圈后返回路口的可能).在每个路口,都有一个开关 ...
- 双端队列BFS:拖拉机
原题链接:https://www.acwing.com/problem/content/2021/ 一个裸的双端队列广搜. #include <iostream> #include < ...
- 双端队列 BFS + Chamber of Secrets CodeForces - 173B
题意: 一个 n×mn\times mn×m 的图,现在有一束激光从左上角往右边射出,每遇到 '#',你可以选择光线往四个方向射出,或者什么都不做,问最少需要多少个 '#' 往四个方向射出才能使光线在 ...
- 电路维修 -> 双端队列 BFS
[问题描述] Elf是来自Gliese星球的少女,她有一辆飞行车.飞行车电路板的整体结构是一个R行C列的网格(R,C≤500),网格的交点都是电路板的接点,每个格子都包含一个电子元件.电子元件的主要部 ...
- AcWing 2019. 拖拉机(双端BFS)
题目链接 https://www.acwing.com/problem/content/2021/ 思路 一个有0代价和1代价边权的最短路,我们用双端队列将0和1边权用一个双端队列分开存储,然后进行一 ...
- 【双端队列广搜/搜索+图论】AcWing 2019.拖拉机 USACO 2012 March Contest Silver Division
[题目描述] 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了. 他的奶牛非常调皮,决定对约翰来场恶作剧. 她们在田地的不同地方放了 NNN 捆干草,这样一来,约翰想要开走拖拉机就必须先移除 ...
- 2019 拖拉机(双端队列广搜)
1. 问题描述: 干了一整天的活,农夫约翰完全忘记了他把拖拉机落在田地中央了.他的奶牛非常调皮,决定对约翰来场恶作剧.她们在田地的不同地方放了 N 捆干草,这样一来,约翰想要开走拖拉机就必须先移除一些 ...
- AcWing 342. 道路与航线 (双端队列广搜问题,SPFA)
题目描述 农夫约翰正在一个新的销售区域对他的牛奶销售方案进行调查. 他想把牛奶送到T个城镇,编号为1~T. 这些城镇之间通过R条道路 (编号为1到R) 和P条航线 (编号为1到P) 连接. 每条道路i ...
最新文章
- 松本行弘为什么要开发Ruby
- 查看有多少个linux用户登录,Linux用户查看系统有多少用户在登录
- 高等数学:第三章 微分中值定理与导数的应用(2)函数单调性 极值 最大值 最小值
- 关于 MySQL5.7.log 版本导出 SQL 语句再导入 8.0.13 版本出现 Incorrect datetime value: ‘0000-00-00 00:00:00‘ 错误的解决办法
- 作研究需要的绣花功夫
- MapReduce案例-wordcount-Reduce阶段代码
- 2021廊坊高考口试成绩查询,2021河北八省联考成绩查询入口
- 百度前端学院-基础学院-第四课
- python求解三元一次方程_北师大版八上数学5.2 求解二元一次方程组 知识点微课精讲...
- Oracle死锁情况
- ubuntn开发php教程,Ubuntu16.04的PHP开发环境配置
- docker hub mysql主从_使用 Docker Compose 搭建 MySQL 数据库主从复制实例
- Life is short, you need Python. ——Bruce Eckel
- 录音转文字 android,录音转文字pro
- 根据c语言标识符的命名规则 标识符只能由,二级C语言教程同步习题集答案解析1-2章.doc...
- 微信支付成功后发送短信通知
- 什么是等保(信息安全等级保护)?
- 【noiOJ】p7939
- 深入浅出React和Redux-程墨
- 分类效果评价(机器学习)