洛谷 P1126 机器人搬重物

news2024/11/15 5:38:29

题目描述

机器人移动学会(RMI)现在正尝试用机器人搬运物品。机器人的形状是一个直径 1.6 米的球。在试验阶段,机器人被用于在一个储藏室中搬运货物。储藏室是一个 N×M 的网格,有些格子为不可移动的障碍。机器人的中心总是在格点上,当然,机器人必须在最短的时间内把物品搬运到指定的地方。机器人接受的指令有:

  • 向前移动 1 步(Creep);
  • 向前移动 2 步(Walk);
  • 向前移动 3 步(Run);
  • 向左转(Left);
  • 向右转(Right)。

每个指令所需要的时间为 1 秒。请你计算一下机器人完成任务所需的最少时间。

输入格式

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

输出格式

一个整数,表示机器人完成任务所需的最少时间。如果无法到达,输出 −1−1。

输入输出样例

输入 #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

输出 #1

12

这题耗时2个多小时终于算是做出来了

 这题求最少时间,很容易想到用广度搜索,然而这题与一般的找出口最短时间稍微有点不同,

1.需要考虑转变方向所消耗的时间。

2.每次移动不止移动一步。

这里我个人觉得还是要抓住广搜的原理,这题中,广搜是把一秒能发生的运动的所有情况都存下来,这题中,不管是改变方向,还是改变位置,都是一秒发生的,所以都要进行入队操作,我们的标记数组也不单单只标记坐标,还要判断每个坐标的4个方向是否都使用过,多了一个考虑的因素(这里我用三维数组标记),导致题目的难度上升。

这题还有一些需要注意的;

1.因为存在一秒移动多个位置,所以不单单只判断到达的那个点是否是障碍物,还需要判断移动的过程中是否遇到障碍物。

2.终点和起点可能重合(特判就行)

3.机器人占四个格子,只有组成正方形的4个格子都为0才能移动(这里刚开始的时候处理一下就行)

具体操作看代码

AC代码

#include<stdio.h>
struct nb {//结构体列队
	int x, y;//x为横坐标,y为纵坐标
	int s, f;//s为步数,//f为方向
}link[850100];
int n, m, x, y, p, q, f;
int hard = 1, tail = 1;
int a[52][52], b[52][52], book[52][52][91];
int main()
{
	int i, j;
	scanf("%d %d", &n, &m);//输入矩阵大小
	for (i = 1; i <= n; i++)
		for (j = 1; j <= m; j++)
			scanf("%d", &a[i][j]);
	for(i=1;i<n;i++)//特殊处理只有4个格子组成的正方形都为0,机器人才能通过
		for (j = 1; j < m; j++)
		{
			if (a[i][j] == 0 && a[i][j + 1] == 0 && a[i + 1][j] == 0 && a[i + 1][j + 1] == 0)
				b[i][j] = 0;
			else
				b[i][j] = 1;
		}
	scanf("%d %d %d %d", &x, &y, &p, &q);//输入起点,终点
	getchar();
	scanf("%c", &f);//起始朝向
	if (x == p && y == q)//特判起点终点是否重合
	{
		printf("0");
		return 0;
	}
	//起始点入队
	link[tail].x = x; link[tail].y = y;
	link[tail].s = 0; 
	if (f == 'E') link[tail].f = 1;//f=1表示东方向,2表示南,3表示西,4表示北
	else if(f == 'S') link[tail].f = 2;
	else if (f == 'W') link[tail].f = 3;
	else  link[tail].f = 4;
	book[x][y][link[tail].f] = 1; tail++;
	int flag = 0;//flag用于判断是否找到出口
	//广搜核心代码
	while (hard < tail)
	{
		//先广度搜索方向
		for (i = 0; i <= 1; i++)
		{
			int tf;
			if (i == 0)//0表示左转
			{
				tf = link[hard].f + 1;
				if (tf == 5)
					tf = 1;
			}
			else//右转
			{
				tf = link[hard].f - 1;
				if (tf == 0)
					tf = 4;
			}
			if (book[link[hard].x][link[hard].y][tf] == 0)//如果这个方向没有入队,进行入队操作
			{
				link[tail].x = link[hard].x;
				link[tail].y = link[hard].y;
				link[tail].s = link[hard].s + 1;
				link[tail].f = tf;
				book[link[hard].x][link[hard].y][tf] = 1;
				tail++;
			}
		}
		//广度搜索不同移动距离
		for (i = 3; i >= 1; i--)
		{
			int tx, ty;
			int fl = 0;//判断移动期间是否遇到障碍物,0为没有遇到
			if (link[hard].f == 1)//link[hard].f大小不同移动方向不同
			{
				tx = link[hard].x;
				ty = link[hard].y + i;
				if (tx<1 || tx>n - 1 || ty<1 || ty>m - 1)//是否越界
					continue;
				for (j = link[hard].y + 1; j <= ty; j++)//判断是否遇到障碍物
				{
					if (b[tx][j] == 1)
					{
						fl = 1;
						break;
					}
				}
			}
			else if (link[hard].f == 2)
			{
				tx = link[hard].x + i;
				ty = link[hard].y;
				if (tx<1 || tx>n - 1 || ty<1 || ty>m - 1)//是否越界
					continue;
				for (j = link[hard].x + 1; j <= tx; j++)//判断是否遇到障碍物
				{
					if (b[j][ty] == 1)
					{
						fl = 1;
						break;
					}
				}
			}
			else if (link[hard].f == 3)
			{
				tx = link[hard].x;
				ty = link[hard].y - i;
				if (tx<1 || tx>n - 1 || ty<1 || ty>m - 1)//是否越界
					continue;
				for (j = link[hard].y - 1; j >= ty; j--)//判断是否遇到障碍物
				{
					if (b[tx][j] == 1)
					{
						fl = 1;
						break;
					}
				}
			}
			else
			{
				tx = link[hard].x - i;
				ty = link[hard].y;
				if (tx<1 || tx>n - 1 || ty<1 || ty>m - 1)//是否越界
					continue;
				for (j = link[hard].x - 1; j >= tx; j--)//判断是否遇到障碍物
				{
					if (b[j][ty] == 1)
					{
						fl = 1;
						break;
					}
				}
			}
			if (book[tx][ty][link[hard].f] == 0 && fl == 0)//如果这个点的这个方向第一次遇到且到这个点期间没有遇到障碍物
			{
				//入队操作+标记
				link[tail].x = tx;
				link[tail].y = ty;
				link[tail].s = link[hard].s + 1;
				link[tail].f = link[hard].f;
				book[tx][ty][link[tail].f] = 1;
				tail++;
				if (tx == p && ty == q)//如果找到出口标记并提前结束
				{
					flag = 1;
					break;
				}
			}
		}
		hard++;//一个点广搜完,判断下一个点
		if (flag == 1)//找到出口,提前结束
			break;
	}
	if (flag == 1)//找到输出最短时间
		printf("%d", link[tail - 1].s);
	else//没找到输出-1
		printf("-1");
	return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

云原生DevOps基础与实战

一、DevOps基础 1、DevOps简介 DevOps 是一系列做法和工具&#xff0c;可以使 IT 和软件开发团队之间的流程实现自动化。其中&#xff0c;随着敏捷软件开发日趋流行&#xff0c;持续集成 (CI) 和持续交付 (CD) 已经成为该领域一个理想的解决方案。在 CI/CD 工作流中&#xff…

ARM 驱动 1.22

linux内核等待队列wait_queue_head_t 头文件 include <linux/wait.h> 定义并初始化 wait_queue_head_t r_wait; init_waitqueue_head(&cm_dev->r_wait); wait_queue_head_t 表示等待队列头&#xff0c;等待队列wait时&#xff0c;会导致进程或线程被休眠&…

最新版的Tuxera NTFS 2024 支持macOS 12系统

备受期待的Tuxera NTFS 2024 Mac中文版终于上线了&#xff0c;小编第一时间为您带来&#xff01;Tuxera NTFS 2024 中文版是一款非常好用的NTFS读写工具&#xff0c;可以让您完整的读写兼容NTFS格式驱动器&#xff0c;对磁盘进行访问、编辑、存储和传输文件等。同时还包括开源磁…

电脑存储位置不够怎么办

电脑内存不够怎么办&#xff01;&#xff01;&#xff01; 我前段时间经常因为电脑D盘内存不够而苦恼&#xff08;毕竟电脑内存就那么丁点&#xff0c;C盘作为系统盘不能随便下东西的情况下&#xff0c;就只能选择其他盘进 方法一&#xff1a;检查电脑硬盘的分区情况&#xf…

git内部原理

git内部原理 介绍目录结构说明 介绍 项目的本地仓库中&#xff0c;包含一个隐藏的.git目录&#xff0c;其不同的文件产生都源于git的各种不同命令造成&#xff0c;文件目录如下所示&#xff1a; 目录结构说明 上面最核心重要的为object目录&#xff0c;目录最主要有三个对象…

设置代码模板创建sql映射文件、Mybatis主配置文件

目录 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 2、Mybatis的主配置文件的介绍 3、通过代码模板创建Sql映射文件 4、通过代码模板创建Mybatis主配置文件 1、Sql映射&#xff08;Sql Mapper&#xff09;文件的介绍 <?xml version"1.0" encod…

AI教我学编程之C#类的基本概念(1)

前言 在AI教我学编程之C#类型 中&#xff0c;我们学习了C#类型的的基础知识&#xff0c;而类正是类型的一种. 目录 区分类和类型 什么是类&#xff1f; 对话AI 追问 实操 追踪属性的使用 AI登场 逐步推进 提出疑问 药不能停 终于实现 探索事件的使用 异步/交互操作 耗时操…

全面分析vcomp140.dll丢失的修复方法,快速解决dll报错问题

vcomp140.dll文件的丢失可能会引发一系列系统运行和软件功能上的问题。作为Microsoft Visual C Redistributable Package的一部分&#xff0c;vcomp140.dll是一个至关重要的动态链接库文件&#xff0c;它的缺失可能导致某些应用程序无法正常启动或执行。具体来说&#xff0c;当…

今年想考CISP的一定要看完❗️

&#x1f3af;国家注册信息安全专业人员&#xff08;英文名称Certified Information Security Professional&#xff0c;简称“CISP"&#xff09;&#xff0c;是由中国信息安全测评中心于2002年推出的、业内公认的国内信息安全领域zqw的gj级认证&#xff0c;是国家对信息安…

【C++】list容器迭代器的模拟实现

list容器内部基本都是链表形式实现&#xff0c;这里的迭代器实现的逻辑需要注意C语言中指针的转换。 list容器如同数据结构中的队列&#xff0c;通常用链式结构进行存储。在这个容器中&#xff0c;我们可以模仿系统的逻辑&#xff0c;在头结点后设置一个“ 哨兵 ”&#xff0c;…

WPF多值转换器

背景&#xff1a;实现Slider拖动可以调整rgb 单转换器&#xff1a;WPF中数据绑定转换器Converter-CSDN博客 在View中&#xff1a; <StackPanel Orientation"Vertical"><Slider x:Name"slider_R" Minimum"0" Maximum"255" Wi…

阿里云优惠券领取入口、使用教程,2024优惠券更新

阿里云优惠代金券领取入口&#xff0c;阿里云服务器优惠代金券、域名代金券&#xff0c;在领券中心可以领取当前最新可用的满减代金券&#xff0c;阿里云百科aliyunbaike.com分享阿里云服务器代金券、领券中心、域名代金券领取、代金券查询及使用方法&#xff1a; 阿里云优惠券…

CentOS 7安装全解析:适合初学者的指导

目录 前言 一.centos安装 1.下载镜像文件 2.安装 二.远程连接&#xff0c;换源 1.下载并且使用MobaXtermMobaXterm free Xserver and tabbed SSH client for Windows (mobatek.net)https://mobaxterm.mobatek.net/ 远程连接 2.换源 前言 在当今的信息化时代&#xff0c…

SpikingJelly笔记之IFLIF神经元

文章目录 前言一、脉冲神经元二、IF神经元1、神经元模型2、神经元仿真 三、LIF神经元1、神经元模型2、神经元仿真 总结 前言 记录整合发放(integrate-and-fire, IF)神经元与漏电整合发放(leaky integrate-and-fire, LIF)神经元模型&#xff0c;以及在SpikingJelly中的实现方法…

mybatis----动态Sql

1.if标签 通过if标签构建动态条件&#xff0c;通过其test属性的true或false来判断该添加语句是否执行。 mapper接口 public interface AccountMapper {List<Account> selectAllByCondition(Account account); } 映射文件 <select id"selectAllByCondition&q…

《文苑》文学艺术文化期刊投稿邮箱投稿方式

《文苑》杂志是国家新闻出版总署批准的正规期刊&#xff0c;本刊致力于中华优秀传统文化、文化旅游、文学艺术、哲学社会科学等方面的理论和实践研究&#xff0c;集理论性、艺术性、指导性于一体&#xff0c;是广大文化、哲学、社会科学工作者交流科研成果、传递学术思想的重要…

(蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)

能够表示为某个整数的平方的数字称为“平方数 虽然无法立即说出某个数是平方数&#xff0c;但经常可以断定某个数不是平方数。因为平方数的末位只可能是:0,1,4,5,6,9 这 6 个数字中的某个。所以&#xff0c;4325435332 必然不是平方数。 如果给你一个 2 位或 2 位以上的数字&am…

【Linux】基本指令收尾

文章目录 日期查找打包压缩系统信息Linux和Windows互传文件 日期 这篇是基本指令的收尾了&#xff0c;还有几个基本指令我们需要说一下 首先是Date&#xff0c;它是用来显示时间和日期 直接输入date的话显示是有点不好看的&#xff0c;所以我们可以根据自己的喜欢加上分隔符&…

MATLAB解决考研数学一题型(上)

闲来无事&#xff0c;情感问题和考研结束后的戒断反应比较严重&#xff0c;最近没有什么写博文的动力&#xff0c;抽空来整理一下考研初试前一直想做的工作——整理一下MATLAB解决数学一各题型的命令~ 本贴的目录遵循同济版的高数目录~ 目录 一.函数与极限 1.计算双侧极限 2…

如何理解 GO 语言的接口 - 鸭子模型

个人认为&#xff0c;要理解 Go 的接口&#xff0c;一定先了解下鸭子模型。 鸭子模型 那什么鸭子模型&#xff1f; 鸭子模型的解释&#xff0c;通常会用了一个非常有趣的例子&#xff0c;一个东西究竟是不是鸭子&#xff0c;取决于它的能力。游泳起来像鸭子、叫起来也像鸭子…