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米的球.在试验阶段,机 ...
随机推荐
- (占坑编辑中)hexo个人博客主页添加百度搜索资源平台
hexo个人博客主页添加百度搜索资源平台 目的是在百度搜你的网站,可以搜到 配置过程 添加效果: 我的个人博客主页,欢迎访问 我的CSDN主页,欢迎访问 我的简书主页,欢迎访问 我的GitHub主页, ...
- Magick.NET跨平台压缩图片的用法
//首先NuGet安装:Magick.NET.Core,Magick.NET-Q16-AnyCPUusing ImageMagick; /// <summary> /// 压缩图片 /// ...
- 从零玩转系列之微信支付实战PC端支付微信回调接口搭建
一.前言 halo各位大佬很久没更新了最近在搞微信支付,因商户号审核了我半个月和小程序认证也找了资料并且将商户号和小程序进行关联,至此微信支付Native支付完成.此篇文章过长我将分几个阶段的文章发布 ...
- Flutter系列文章-Flutter进阶2
这一节我将再详细地为您介绍 Flutter 进阶主题,包括导航和路由.状态管理.异步处理.HTTP请求和Rest API,以及数据持久化.让我们逐个介绍这些主题. 1.导航和路由 在 Flutter ...
- 【pandas小技巧】--反转行列顺序
反转pandas DataFrame的行列顺序是一种非常实用的操作.在实际应用中,当我们需要对数据进行排列或者排序时,通常会使用到Pandas的行列反转功能.这个过程可以帮助我们更好地理解数据集,发现 ...
- python中的注释noqa: F401
在Python中,"noqa: F401" 是一个特殊的注释指示.它主要用于在静态代码检查工具(例如Flake8)运行时,告知工具忽略特定的 "F401" 错误 ...
- python爬虫抓取图片
一.什么是爬虫 什么是爬虫?爬虫是蜘蛛么?是八爪鱼么?nonono. 爬虫是指请求网站并获取数据的自动化程序,又称网页蜘蛛或网络机器,最常用领域是搜索引擎,最常用的工具是八爪鱼. 它的基本流程分为以下 ...
- 震惊!强大的接口自动化测试框架2.0,unittest与pytest无缝穿插对接,可以像postman一样编写代码
theme: fancy highlight: arta 项目介绍 接口自动化测试项目2.0 软件架构 本框架主要是基于 Python + unittest + ddt + HTMLTestRunne ...
- Python 潮流周刊#18:Flask、Streamlit、Polars 的学习教程
你好,我是猫哥.这里每周分享优质的 Python.AI 及通用技术内容,大部分为英文.标题取自其中三则分享,不代表全部内容都是该主题,特此声明. 本周刊由 Python猫 出品,精心筛选国内外的 25 ...
- css面试题一
1.继承 css的继承:就是给父级设置一些属性,子级继承了父级的该属性,这就是我们css中的继承.官方的解释,继承是一种规则,它允许样式不仅应用于特定的html标签元素,而且应用于其后代元素. a.有 ...