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米的球.在试验阶段,机 ...
随机推荐
- MySQL数据库的集群方案
读写分离结构(主从) 读多写少,也就是对数据库读取数据的压力比较大. 其中一个是主库,负责写入数据,成为写库:其他都是从库,负责读取数据,成为读库. 对我们的要求: 读库和写库的数据一致: 写数据必须 ...
- 【SpringBoot】Session共享
本文参考 Spring Boot 一个依赖搞定 session 共享,没有比这更简单的方案了! 在传统的单服务架构中,只有一个服务器,那就不会存在session共享的问题,但如果在分布式/集群项目中, ...
- Day09_Java_作业
A:简答题 1.什么是多态,多态的前提是什么? 2.多态中成员(成员变量,成员方法,静态成员方法)的访问特点是什么? 3.多态的好处? 4.多态的弊端是什么,如果我们想访问子类的特有的功能我们应该怎么 ...
- 面试官:一个 SpringBoot 项目能处理多少请求?(小心有坑)
你好呀,我是歪歪. 这篇文章带大家盘一个读者遇到的面试题哈. 根据读者转述,面试官的原问题就是:一个 SpringBoot 项目能同时处理多少请求? 不知道你听到这个问题之后的第一反应是什么. 我大概 ...
- 面霸的自我修养:Java线程专题
王有志,一个分享硬核Java技术的互金摸鱼侠加入Java人的提桶跑路群:共同富裕的Java人 平时我在网上冲浪的时候,收集了不少八股文和面试文,内容虽然多,但质量上良莠不齐,主打一个不假思索的互相抄, ...
- RobotFrameWork环境搭建及使用
RF环境搭建 首先安装python并且配置python环境变量 pip install robotframework pip install robotframework-ride 生产桌面快捷方式 ...
- Spark RDD惰性计算的自主优化
原创/朱季谦 RDD(弹性分布式数据集)中的数据就如final定义一般,只可读而无法修改,若要对RDD进行转换或操作,那就需要创建一个新的RDD来保存结果.故而就需要用到转换和行动的算子. Spark ...
- 《Web安全基础》03. SQL 注入
@ 目录 1:简要 SQL 注入 2:MySQL 注入 2.1:信息获取 2.2:跨库攻击 2.3:文件读写 2.4:常见防护 3:注入方法 3.1:类型方法明确 3.2:盲注 3.3:编码 3.4: ...
- pytest-xdist分布式测试原理浅析
pytest-xdist执行流程: 解析命令行参数:pytest-xdist 会解析命令行参数,获取用户指定的分发模式.进程数.主机列表等信息. 加载测试用例:pytest-xdist 会加载所有的 ...
- Programming abstractions in C阅读笔记:p139-p143
<Programming Abstractions In C>学习第55天,p139-p140,总结如下: 一.技术总结 1.文件I/O操作 文件I/O操作可以分为一下这些步骤: (1)声 ...