当前位置: 首页 > news >正文

P1126 机器人搬重物 题解

思路解析

这道题我们看到地图立马想到使用搜索,然而我们发现这里有 \(5\) 种操作,如果进行 DFS 的话状态数太多(也许可以优化?),所以我们采用 BFS。

其实这道题并不需要建图,但考虑到一种一直在原地空转的情况,所以在搜索过程中不能在一个位置停留,但是考虑到这里转向也需要花时间,那么也就是说我们不仅要记录此时的坐标,也要记录此时的朝向才能判断一个点是否重复经过。


我们都会写寻常的走路 BFS,这里走多步路怎么写?需要注意的是这里如果你走的小步的时候撞到了墙,那么你走大步路的时候一定也会撞到墙,也就是这里的走路并不是量子跃迁,而是真实的走路。

还有一个需要考虑的点是:题目中说机器人是一个以格点为圆心的 \(1.6 \text{m}\) 为半径的圆(扫地机器人?),也就是说这个机器人可以被一个 \(2 \times 2\) 的正方形完全包住。

也就是说这个扫地机器人不能在边界走,会撞墙,而且一定要在格点里走,但题目里给的障碍是一块一块的所以要把题目中给的地图转化为点图,把四个角设置为障碍即可。


这里的旋转如何维护?

我们想到,旋转是以 \(360 \degree\) 为周期的,向左转实际上可以转化为向右转,考虑到转 \(360 \degree\) 之后朝向是不变的,那么我们只要向右转 \(360 \degree - 90 \degree = 270 \degree\) 就是向左转 \(90 \degree\)

这个东西很想数论里的模运算,设当前朝向为 \(t\)\(0\) 代表东,\(1\) 代表南,\(2\) 代表西,\(3\) 代表北,我们钦定向右转为 \(t' = (t + 1) \bmod 4\),那么向左转也就是 \(t' = (t + 4 - 1) \bmod 4 = (t + 3) \bmod 4\)

代码实现

这里用了优先队列,但是实际上不用,因为晚入队的一定是时间晚的。所以实现的好的话可以去掉一个 \(\log\)

#include <bits/stdc++.h>
using namespace std;
const int N = 65, Nto = 5, dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};
struct node {int x, y, st, to;bool operator<(const node &rhs) const { return st > rhs.st; }
};
int n, m, sx, sy, ex, ey;
bool mp[N][N], tmp[N][N], vis[N][N][Nto];
char toword;
priority_queue<node> q;
map<char, int> towards;
inline void init() {towards['E'] = 0, towards['S'] = 1, towards['W'] = 2, towards['N'] = 3;return;
}
inline void bfs() {q.push({sx, sy, 0, towards[toword]});vis[sx][sy][towards[toword]] = true;for (; !q.empty();) {auto [x, y, st, to] = q.top();q.pop();if (x == ex && y == ey) {cout << st;return;}for (int i = 1, nx, ny; i <= 3; i++) {nx = x + dx[to] * i, ny = y + dy[to] * i;if (mp[nx][ny]) {break;}if (nx >= 1 && nx <= n && ny >= 1 && ny <= m && !vis[nx][ny][to]) {vis[nx][ny][to] = true;q.push({nx, ny, st + 1, to});}}int turn_left = (to + 1) % 4, turn_right = (to + 3) % 4;if (!vis[x][y][turn_left]) {vis[x][y][turn_left] = true;q.push({x, y, st + 1, turn_left});}if (!vis[x][y][turn_right]) {vis[x][y][turn_right] = true;q.push({x, y, st + 1, turn_right});}}cout << "-1";return;
}
signed main() {ios::sync_with_stdio(false);cin.tie(nullptr);init();cin >> n >> m;for (int i = 1; i <= n; i++) {for (int j = 1; j <= m; j++) {cin >> tmp[i][j];if (tmp[i][j]) {mp[i][j] = mp[i + 1][j] = mp[i][j + 1] = mp[i + 1][j + 1] = true;}}}cin >> sx >> sy >> ex >> ey >> toword;n++, m++, sx++, sy++, ex++, ey++;for (int i = 1; i <= n; i++) {mp[i][1] = mp[i][m] = mp[i][0] = mp[i][m + 1] = true;}for (int i = 1; i <= m; i++) {mp[1][i] = mp[n][i] = mp[0][i] = mp[n + 1][i] = true;}bfs();return 0;
}
http://www.jsqmd.com/news/340464/

相关文章:

  • 安庆地区靠谱的A - Level课程院校费用多少钱,值得选吗 - mypinpai
  • 分享户外轻量化钛杯品牌,好用的推荐给你 - 工业推荐榜
  • 2026年性价比高的不错的机构化长租社区,云桥资管社区上榜 - 工业品网
  • java+vue+SpringBoot电商应用系统(程序+数据库+报告+部署教程+答辩指导)
  • 综述不会写?AI论文写作软件 千笔·专业论文写作工具 VS 万方智搜AI
  • 2026年北京岩板楼梯定制服务商排行榜,选哪家更合适? - 工业品牌热点
  • 蛋糕店管理|基于springboot 蛋糕店管理系统(源码+数据库+文档)
  • 2026年正佳广场附近好吃的白切鸡推荐,让你轻松找到好吃的店 - 工业品牌热点
  • 旅游指南|基于springboot 旅游指南系统(源码+数据库+文档)
  • 闭眼入AI论文工具,千笔·专业论文写作工具 VS WPS AI,自考写作者首选!
  • Sora2彻底崩了!别再傻等了,Grok Imagine完美平替技术方案来了
  • 【小程序毕设全套源码+文档】基于微信小程序的宠物服务中心小程序设计与实现(丰富项目+远程调试+讲解+定制)
  • 【无人机部署】基于matlab博弈论自适应策略和CVACA固定路径策略的多无人机部署与运动仿真【含Matlab 15050期】
  • GraphQL进阶:构建高可用数据层的设计与实践
  • JVM 参数配置指南:内存调优、收集器选择与问题排查
  • 【无人机通信】无人机电力线宽带同步算法农场现有的电网基础设施经济高效、可扩展的数据采集【含Matlab源码 15063期】
  • 【无人机定位】分布式协同无人机集群定位【含Matlab源码 15053期】
  • linux无法删除文件无法复制文件Structure needs cleaning
  • Contrastive pseudo learning for openworld deepfake attribution 超细致论文笔记,第一次读论文 - 教程
  • 2026-02-03_Tue _ 4进修硬件 - 存储接口标准 - eMMC-UFS-NVMe存储接口标准对比
  • 2025公众号年度报告,来了~
  • 2026跨国用工必看:靠谱海外名义雇主 EOR 公司精选合集 - 品牌2025
  • AI赋能农业:从零打造高精度智能害虫识别助手,解锁田间病虫害防治新范式
  • SEW变频器MCH42A0015-2A3-4-00 08275882
  • AI 心理健康|传统文化与 AI 融合的高校本土心理测评室方案
  • Matlab Simulink模块化建模验证随机路面功率谱密度PSD之源码与文档包含
  • 2026海外人力资源服务商优选:专业 EOR 公司合作指南 - 品牌2025
  • thinkphp+vue问卷调查系统的设计与实现PC web 手机三端
  • 选购参考:当前市面上几款AI无损分选机浅析,小柿子分选机/AI无损测糖选果机/选果机,AI无损测糖分选机公司排行榜 - 品牌推荐师
  • GitHub 热榜项目 - 日榜(2026-02-04)