P1126 机器人搬重物 题解
Problem
题目概括
$n \times m $ 的网格,有些格子是障碍格。\(0\) 无障碍,\(1\) 有障碍。机器人有体积,总是在格点上。
有5种操作:
- 向前移动 \(1/2/3\) 步
- 左转 \(/\) 右转
每次操作需要 \(1\) 秒。
求从 \(x_1,y_1\) 到 \(x_2,y_2\) 点的最短路。
机器人有一个初始方向 $ E / S / W / N$ (东南西北)。
思路
- 考察算法:BFS求最短路。
- 实现过程 \(\&\) 注意点:
- 障碍是在格子上的,需要将周围 \(4\) 个点标记为障碍。
- 本题下标从 \(0\) 开始。
- 由于机器人有体积,所以可走的范围只有 \((1,1) ~ (n - 1,m - 1)\) !
- 在一次性走 \(2,3\) 步的时候,一定要判断 \(a\) 数组中路上的每一个点是否为 \(0\)。不然会出现 \(“\) 穿墙 \(”\) 的情况。
定义一个 queue<node> q; ,然后 \(node\) 里面有 \(4\) 个信息:\(x,y,k,step\)。 \(k\) 代表当前的方向在方向数组中的下标,\(step\) 表示花了几秒 \((\)走了几步\()\)。
然后本题 \(bool\) 类型的 \(vis\) 数组可以开成三维的。
\(vis[x][y][k]\) 代表 \(x,y\) 点的 \(k\) 方向已经被走过了。
然后 \(BFS\) ,就可以 \(AC\) 了~
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 60;
struct node {
int X, Y, K, stp;
};
queue<node> q;
// 方向数组
int fx[5] = {0, 1, 0, -1};
int fy[5] = {1, 0, -1, 0};
int n, m;
int a[N][N], sx, sy, ex, ey, k, xx;
bool vis[N][N][5];
char c;
map<char, int> mp; // 映射四个方向对应方向数组的下标(0-3)
// 将障碍格四周的点标记为1
void fun(int x, int y) {
a[x][y] = a[x - 1][y - 1] = a[x - 1][y] = a[x][y - 1] = 1;
}
// 检验坐标是否合法
bool check(int x, int y) { return x > 0 && x < n && y > 0 && y < m; }
// 左转
int TurnLeft(int tmpk) { return (tmpk + 3) % 4; }
// 右转
int TurnRight(int tmpk) { return (tmpk + 5) % 4; }
int bfs() {
// 初始化
q.push((node) {sx, sy, k, 0});
vis[sx][sy][k] = true;
while (!q.empty()) {
int x = q.front().X, y = q.front().Y, tk = q.front().K, step = q.front().stp;
q.pop();
// 到达终点
if (x == ex && y == ey) return step;
// 左转 & 右转
if (!vis[x][y][TurnLeft(tk)] && !a[x][y]) {
q.push((node) {x, y, TurnLeft(tk), step + 1});
vis[x][y][TurnLeft(tk)] = true;
}
if (!vis[x][y][TurnRight(tk)] && !a[x][y]) {
q.push((node){x, y, TurnRight(tk), step + 1});
vis[x][y][TurnRight(tk)] = true;
}
int oi = x + fx[tk], oj = y + fy[tk];
int oi_2 = x + 2 * fx[tk], oj_2 = y + 2 * fy[tk];
int oi_3 = x + 3 * fx[tk], oj_3 = y + 3 * fy[tk];
// 走 1/2/3 步
if (!vis[oi][oj][tk] && !a[oi][oj] && check(oi, oj)) {
q.push((node){oi, oj, tk, step + 1});
vis[oi][oj][tk] = true;
}
if (check(oi_2, oj_2) && !vis[oi_2][oj_2][tk] && !a[oi][oj] && !a[oi_2][oj_2]) {
q.push((node){oi_2, oj_2, tk, step + 1});
vis[oi_2][oj_2][tk] = true;
}
if (check(oi_3, oj_3) && !vis[oi_3][oj_3][tk] && !a[oi][oj] && !a[oi_2][oj_2] && !a[oi_3][oj_3]) {
q.push((node){oi_3, oj_3, tk, step + 1});
vis[oi_3][oj_3][tk] = true;
}
}
return -1; // 走不到
}
int main() {
mp['E'] = 0, mp['S'] = 1, mp['W'] = 2, mp['N'] = 3; // 初始化方向
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i++) {
a[i][0] = a[0][i] = a[i][m] = a[n][i] = 1;
for (int j = 1; j <= m; j++) {
scanf("%d", &xx);
if (xx == 1) fun(i, j); // 障碍点四周的点都标记为1
}
}
scanf("%d%d%d%d", &sx, &sy, &ex, &ey);
cin >> c;
k = mp[c]; // 映射方向
printf("%d", bfs());
return 0;
}
P1126 机器人搬重物 题解的更多相关文章
- luogu P1126 机器人搬重物 题解
luogu P1126 机器人搬重物 题解 题目描述 机器人移动学会(\(RMI\))现在正尝试用机器人搬运物品.机器人的形状是一个直径\(1.6\)米的球.在试验阶段,机器人被用于在一个储藏室中搬运 ...
- P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- 洛谷——P1126 机器人搬重物
P1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有 ...
- 洛谷P1126 机器人搬重物
洛谷1126 机器人搬重物 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格, ...
- 洛谷P1126 机器人搬重物【bfs】
题目链接:https://www.luogu.org/problemnew/show/P1126 题意: 给定一个n*m的方格,机器人推着直径是1.6的球在格子的线上运动. 每一秒钟可以向左转,向右转 ...
- 洛谷P1126机器人搬重物[BFS]
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
- 洛谷 P1126 机器人搬重物
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径 $1.6 米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个 N×MN \times MN×M ...
- luogu P1126 机器人搬重物
题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机器人被用于在一个储藏室中搬运货物.储藏室是一个N*M的网格,有些格子为不可移动的障碍.机 ...
- 洛谷 P1126 机器人搬重物 (BFS)
题目链接:https://www.luogu.org/problemnew/show/P1126 吐槽:这题很阴险 一开始没把格子图转化成点图:30分 转化成点图,发现样例过不去,原来每步要判断vis ...
- 洛谷—— P1126 机器人搬重物
https://www.luogu.org/problem/show?pid=1126 题目描述 机器人移动学会(RMI)现在正尝试用机器人搬运物品.机器人的形状是一个直径1.6米的球.在试验阶段,机 ...
随机推荐
- java后台导出表格文件
Java类所需jar包 import java.io.File; import java.io.IOException; import java.io.InputStream; import java ...
- Hexo博客Next6.0版本主题配置(背景图片加载、侧边栏社交小图标设置、设置网站图标)
随机背景图片加载 原理 自动更换背景是修改添加背景的css样式实现 图片来源 https://source.unsplash.com/ 修改背景样式 修改themes\next\source\css\ ...
- Java相关小知识_6_15
实体完整性要求每个表都有唯一标识符,每一个表中的主键字段不能为空或者重复的值. 参照完整性要求关系中不允许引用不存在的实体.设定相应的更新删除插入规则来更新参考表. Java语言使用的是Unicode ...
- 【WebGL系列-04】清除缓冲区并绘制图形
清除缓冲区并绘制图形 前文中已经准备好了webgl程序和绘制所用的数据,但是在绘制图像之前,还要对画布进行处理. 清除缓冲区 由于图像的绘制是一帧一帧绘制,每一帧针对当前的状态,计算屏幕上每个像素的颜 ...
- SQL: Unknown collation: 'utf8mb4_0900_ai_ci'
错误原因 字符集错误,我的版本是5.7,文件中是8.0 解决方案 替换字符集 utf8mb4_0900_ai_ci替换为utf8_general_ci utf8mb4替换为utf8 注意:注释中的部分 ...
- FreeSWITCH通过mod_mariadb原生连接MySQL
前言 根据官方更新说明(https://freeswitch.org/confluence/display/FREESWITCH/FreeSWITCH+1.10.x+Release+notes),从1 ...
- 应用程序通过 Envoy 代理和 Jaeger 进行分布式追踪(一)
Istio 支持通过 Envoy 代理进行分布式追踪,代理自动为其应用程序生成追踪 span,只需要应用程序转发适当的请求上下文即可.Istio 支持很多追踪系统,包括 Zipkin, Jaeger, ...
- 一文详解自然语言处理两大任务与代码实战:NLU与NLG
自然语言处理(NLP)涵盖了从基础理论到实际应用的广泛领域,本文深入探讨了NLP的关键概念,包括词向量.文本预处理.自然语言理解与生成.统计与规则驱动方法等,为读者提供了全面而深入的视角. 作者 Te ...
- go语言环境要这样搭建才"省钱"
go语言环境要这样搭建才省钱 目录 go语言环境要这样搭建才省钱 本篇概要 集成开发环境工具(ide) Goland或IntelliJ IDEA Visual Studio Code 其他集成开发环境 ...
- 《SQL与数据库基础》10. 存储引擎
目录 存储引擎 MySQL体系结构 存储引擎简介 三种经典存储引擎 InnoDB 逻辑存储结构 MyISAM Memory 区别及特点 存储引擎选择 本文以 MySQL 为例 存储引擎 MySQL体系 ...