P1126 机器人搬重物 题解(bfs 经典广搜)

本文详细解析了P1126题目的解答,机器人在N×M网格中搬运物品,需要找到最短路径。通过使用广度优先搜索(BFS)算法,考虑机器人的边界条件和障碍物,计算完成任务的最少时间。文中提供了AC代码,并对解题思路进行了注释说明。
摘要由CSDN通过智能技术生成

P1126 机器人搬重物

题目

P1126 机器人搬重物

题目描述
机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径1.61.6米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:向前移动1步(Creep);向前移动2步(Walk);向前移动3 步(Run);向左转(Left);向右转(Right)。每个指令所需要的时间为1 秒。请你计算一下机器人完成任务所需的最少时间。

输入格式
第一行为两个正整数N,M(N,M≤50),下面N行是储藏室的构造,0表示无障碍,1表示有障碍,数字之间用一个空格隔开。接着一行有4个整数和1个大写字母,分别为起始点和目标点左上角网格的行与列,起始时的面对方向(东E,南S,西W,北N),数与数,数与字母之间均用一个空格隔开。终点的面向方向是任意的。

输出格式
一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出−1。
在这里插入图片描述

输入输出样例
输入

9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S

输出

12

分析

这道题看似复杂,但是只要注意题目中的边界问题,剩下的就是常规的BFS流程了。

首先需要注意,机器人是一个圆,我们每次记录的是他的中心点,所以我们需要小心机器人的边界判定。其次,障碍物占据一个格子,这里规定障碍物是起始点在左上角的格子 。

我的思路是将每个坐标的到达时间都记录下来,也就是对每个坐标的到达时间进行记忆化,这里还要加入一个方向数组,是为了方便判定每个点的四周是否都被访问过。

首先判定直行可以走几步(0-3),将能走的坐标都加入到队列中,走完后再进行方向的变动。每次执行命令都要让时间加1,并将新坐标入队。

下面是AC代码,具体解题过程可以见我代码的注释~

代码

#include<iostream> 
#include <queue> 
using namespace std;
typedef struct{
   
	int x,y,d; //分别对应列坐标、行坐标、朝向
} Site; 
const int maxn = 55;
int n, m;
Site s, f; //起点,终点 
int d; //当前方向 
int dir[4][2] = {
   {
   1, 0}, {
   0, 1}, {
   -1, 0}, {
   0, -1}}; //方向, 东南西北 
int map[maxn][maxn];
int vis[maxn][maxn][4]; 
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值