P1126 机器人搬重物

news/2025/3/29 19:24:07/文章来源:https://www.cnblogs.com/lzn-tops/p/18794073

本文作者:\(\color{red}\text{DoubleQLzn}\color{green}✓\)

题目:洛谷 P1126 机器人搬重物 - 题目传送门

难度:\(\color{green}\tt 普及+\)

\(\text{Knowledge}\)

  • \(5\)】广度优先搜索
  • \(3\)】队列
  • \(3\)】结构体

\(\text{Solution}\)

本题一有 \(5\) 种操作,其中方向影响我们的移动。

如果我们直接对点进行操作,无法得到移动的方向。因此,我们考虑拆点

本来的状态为 \((i,j)\),表示机器人以第 \(i\) 行第 \(j\) 列为左上角。我们考虑加上方向一维,状态为 \((i,j,d)\)

为了方便左转与右转:

  • 东:\(d=0\)
  • 南:\(d=1\)
  • 西:\(d=2\)
  • 北:\(d=3\)

因此 \((d+3)\bmod 4\)\((d+1)\bmod 4\) 即为左转与右转。最后用状态广度优先搜索即可。在向前时,用原本的方向数组乘 \(1,2,3\) 即可。

下面来讲讲这道题的坑点:

  • 机器人不能穿墙,如果走 \(1\) 步有墙,后面的都不行。
  • 机器人直径是 \(1.6\) 米。
    • \((i,j)\) 为障碍,则 \((i-1/i,j-1/j)\) 也是障碍。
    • 因为是左上角,最后一行与最后一列不能经过。

\(\text{Code}\)

#include <bits/stdc++.h>
using namespace std;
int n,m,a[105][105],step[105][105][4],sx,sy,ex,ey;
char dir;
int dx[4] = {0,1,0,-1};
int dy[4] = {1,0,-1,0}; 
struct Node
{int x,y,d;
}; 
void bfs(int x,int y,int d)
{queue<Node> q;q.push({x,y,d});step[x][y][d] = 0;while (!q.empty()){Node t = q.front();q.pop();x = t.x,y = t.y,d = t.d;if (x == ex && y == ey){cout << (step[ex][ey][d]);return;}int nd = (d + 1) % 4;if (!step[x][y][nd]){step[x][y][nd] = step[x][y][d] + 1;q.push({x,y,nd});}nd = (d + 3) % 4;if (!step[x][y][nd]){step[x][y][nd] = step[x][y][d] + 1;q.push({x,y,nd});}for (int i = 1;i <= 3;i++){int nx = x + dx[d] * i,ny = y + dy[d] * i;if (nx >= 1 && nx < n && ny >= 1 && ny < m && a[nx][ny] == 0){if (!step[nx][ny][d]){step[nx][ny][d] = step[x][y][d] + 1;q.push({nx,ny,d});}} else break;}}cout << -1;
}
int main()
{cin >> n >> m;for (int i = 1;i <= n;i++){for (int j = 1;j <= m;j++){int t;cin >> t;if (t == 1){a[i][j] = 1;a[i - 1][j] = 1;a[i][j - 1] = 1;a[i - 1][j - 1] = 1;}}}cin >> sx >> sy >> ex >> ey >> dir;int d = 0;if (dir == 'S') d = 1;if (dir == 'W') d = 2;if (dir == 'N') d = 3;bfs(sx,sy,d);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/906222.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

杭州储存卡数据恢复之雷克沙短路损坏不识别售后维修失败二次修复

这是一张64G的Lexar雷克沙CF接口内存卡,型号是1066X,CANON佳能5D4相机使用的,这张存储卡是硬件出问题了无法识别,说是可能插卡时角度不对用力顶入后使顶针VCC脚变形短路,通电后导致芯片损坏。客户先寄修到雷克沙官方售后那边进行维修,但最终检测修复失败,说是短路严重,…

RabbitMQ核心架构

Producer:负责产生消息。 Connection:RabbitMQ客户端和代理服务器之间的TCP连接。 Channel:建立在连接之上的虚拟连接,RabbitMQ操作都是在信道中进行。 Broker:一个Broker可以看做一个RabbitMQ服务节点或者服务实例。 Exchange:生产者发送消息到交换器,交换器根据路由ke…

024 登录页-main退出登录功能的实现

这个页面这样写一、 用于创建一个按钮并绑定一个点击事件处理函数。以下是对这段代码的详细解释:<button> 标签:这是 HTML 中的按钮元素,用于在页面上显示一个可点击的按钮。@click 指令:在 Vue.js 中,@click 是一个事件绑定指令,它用于监听按钮的点击事件。@ 是 …

ProfiNet转Modbus TCP协议转换网关驱动三菱PLC与伺服的毫秒级动态参数同步

一、案例背景 在“双碳”战略推动下,新能源锂电池行业迎来爆发式增长。某新能源科技公司新建的锂电池生产线中,涂布工序作为核心环节,采用了德国博世力士乐IndraDriveCX系列伺服驱动器(ProfiNet从站)实现高精度张力控制,而车间级监控系统选用三菱L系列PLC(ModbusTCP主站…

MySQL-面经

目录 MVCC概念?如何实现? 可重复读概念 可重复读下,快照是在什么时候生成的,是事务启动时,还是语句执行前 可重复读下,执行两个select语句,会生成几个快照?MVCC概念?如何实现? MVCC概念:通过「版本链」来控制并发事务访问同一个记录时的行为就叫 MVCC(多版本并发控制…

算法备案五大真相

一些开发者已经了解到算法备案是AI类产品必做的一项资质了,但因为经验有限,依然存在一些盲点和不清楚的地方。今天,我就整理出了最基础但也最重要的五大算法备案真相,供大家参考。如有其它疑问,欢迎进一步咨询算法备案办理问题。一、流程统一,审核不统一 算法备案有全国统…

Cknife配置

项目地址 https://github.com/Chora10/Cknife 使用Java编译器 这里使用eclipse 1. File->Open Project from File System...选择目录,点击完成2. 在刚添加的项目上按右键,并点击导出Export选择可运行的jar文件选择路径3. 这里没有选择或没有配置有效的“Launch configurat…

医疗场景实战:百条数据 RFT 微调盘古大模型,精度大幅提升

摘要:RFT强化微调是一种新型LLM微调方法,通过强化学习与传统微调结合,少量数据即可显著增强领域场景的模型能力。本文分享自华为云社区《医疗场景实战|百条数据RFT微调盘古大模型,效果超越DS》,作者:盘古大模型官方账号。 医疗场景实战|百条数据RFT微调盘古大模型,效果超…

SQL Server 启用 sa

Hello World ‍‍ ‍‍‍‍‍

一文看懂大数据生态圈完整知识体系

随着大数据行业的发展,大数据生态圈中相关的技术也在一直迭代进步,希望能通过本文帮助大家快速构建大数据生态圈的完整知识体系。 目前大数据生态圈中的核心技术总结下来如图1所示,分为以下9类,下面分别介绍。大数据生态下9类核心技术 01 数据采集技术框架 数据采集也被称为…

神秘另解集合,想出来一样的东西这辈子有了

P1600 考虑重链剖分。然后把每个路径给变成 \(O(\log n)\) 个重链,根据重链剖分的性质,每条重链的 dfs 序都为连续,所以把图画出来大概是像下图这样:横轴是时间,纵轴是 dfs 序。一个时间 \(t\) 在节点 \(p\) 的人数就是经过 \((t,\text{dfn}_p)\) 的线段数量。线段数量为 …

功率器件热设计基础(十三)——使用热系数Ψth(j-top)获取结温信息

功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的热设计基础知识,才能完成精确热设计,提高功率器件的利用率,降低系统成本,并保证系统的可靠性。。。**前言 ** 功率半导体热设计是实现IGBT、碳化硅SiC高功率密度的基础,只有掌握功率半导体的…