动态迷宫(回溯法)

题目:今天蒜头君打算测试一下动态迷宫。迷宫中有一些动态楼梯,它们每隔一分钟就变动一次方向。比如下面的例子里,一开始楼梯在竖直方向,一分钟以后它移动到了水平方向,再过一分钟它又回到了竖直方向。蒜头君发现对他来说很难找到能使得他最快到达目的地的路线,这时聪明的蒜头君便想到了万能的你,来解决这个问题。

输入格式

第一行有两个数 M 和 N

接下来是一个MN列的地图,'*'表示障碍物,'.'表示走廊,'|'或者'-'表示一个楼梯,并且标明了它在一开始时所处的位置:'|'表示的楼梯在最开始是竖直方向,'-'表示的楼梯在一开始是水平方向。地图中还有一个'S'是蒜头君的位置,'T'是目标,0≤M,N≤20,地图中不会出现两个相连的梯子。蒜头君每秒只能停留在'.''S''T'所标记的格子内。

输出格式

输出一个整数,表示到达目标的最短时间。

注意:蒜头君只能每次走到相邻的格子而不能斜走,每移动一次恰好为一分钟,并且蒜头君登上楼梯并经过楼梯到达对面的整个过程只需要一分钟,蒜头君从来不在楼梯上停留。并且每次楼梯都恰好在蒜头君移动完毕以后才改变方向。

样例输入1

5 5
**..T
**.*.
..|..
.*.*.
S....

样例输出1

7

样例输入2

5 5
**..T
**.*.
.*|..
.*.*.
S...*

样例输出2

8

#include<iostream>
using namespace std;
const int N=15;
char a[N][N];
bool vis[N][N];
int n,m;
int dx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
int min_t=0x3f3f3f3f;
 
void dfs(int x,int y,int t){
	if(t>=min_t) return;
	if(a[x][y]=='T'){
		if(t<min_t) min_t=t;
		return;
	}
	for(int i=0;i<4;i++){
		//下一个点 
		int nextx=x+dx[i];
		int nexty=y+dy[i];
		if(!vis[nextx][nexty]&&a[nextx][nexty]!='*'&&nextx>=1&&nextx<=n&&nexty>=1&&nexty<=m){
			
			if(a[nextx][nexty]=='-'){//-楼梯 
				nextx=nextx+dx[i];
				nexty=nexty+dy[i];
				if(!vis[nextx][nexty]&&a[nextx][nexty]!='*'&&nextx>=1&&nextx<=n&&nexty>=1&&nexty<=m){
					if(t%2==0&&i%2==1){//t为偶数,楼梯为原始状态 -,此时上下走要等待1分钟 ,i=1,3为下、上 
						t++; 
					}else if(t%2==1&&i%2==0){//t为奇数,楼梯变为 |,此时左右走要等待1分钟 ,i=0,2为右、左 
						t++;
					} 
					vis[nextx][nexty]=true;
					dfs(nextx,nexty,t+1);
					vis[nextx][nexty]=false;
				}
			}else if(a[nextx][nexty]=='|'){//|楼梯
				nextx=nextx+dx[i];
				nexty=nexty+dy[i];
				if(!vis[nextx][nexty]&&a[nextx][nexty]!='*'&&nextx>=1&&nextx<=n&&nexty>=1&&nexty<=m){
					if(t%2==0&&i%2==0){//t为偶数,楼梯为原始状态 |,此时左右走要等待1分钟 ,i=0,2为右、左 
						t++; 
					}else if(t%2==1&&i%2==1){//t为奇数,楼梯变为 -,此时上下走要等待1分钟 ,i=1,3为下、上
						t++;
					} 
					vis[nextx][nexty]=true;
					dfs(nextx,nexty,t+1);
					vis[nextx][nexty]=false;
				}
			}else{//不是楼梯 
				vis[nextx][nexty]=true;
				dfs(nextx,nexty,t+1);
				vis[nextx][nexty]=false;
			}
			
		}
	}
}
int main(){
	cin>>n>>m;
	int startx,starty;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			if(a[i][j]=='S'){
				startx=i;
				starty=j;
			}
		}
	}
	vis[startx][starty]=true;
	dfs(startx,starty,0);
	if(min_t==0x3f3f3f3f) cout<<-1<<endl; 
	else cout<<min_t<<endl;
	return 0;
} 

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ 【PCL】点云数据归一化、统一化处理

点云数据归一化、统一化&#xff0c;很重要&#xff0c;比如&#xff0c;你做完一个模型后&#xff0c;发现鼠标控制模型时&#xff0c;根本不是以中心点控制&#xff0c;就是因为数据没有归一化等 pcl::PointCloud<pcl::PointXYZ>::Ptr normialize(pcl::PointCloud<…

【深度学习】PromptFix:多功能AI修图

PromptFix:你来提示,我们修图 NeurIPS 2024 最近,在计算机视觉和图像处理领域,一个名为PromptFix的新项目引起了广泛关注。PromptFix是一个基于PyTorch实现的开源项目,旨在根据用户的自然语言指令,对受损或需要处理的图像进行智能修复和优化。 本文将详细介绍PromptFix…

淘宝商品详情API大揭秘:用Python开启探险之旅

淘宝&#xff0c;一个充满奇迹的丛林 在这个名为淘宝的丛林里&#xff0c;每一件商品都是一座神秘的宝藏。而我们&#xff0c;作为勇敢的探险家&#xff0c;将用Python这把瑞士军刀&#xff0c;去揭开这些宝藏的面纱。准备好了吗&#xff1f;让我们一起踏上这段奇妙的探险之旅…

【Android】名不符实的Window类

1.“名不符实”的Window类 Window 是一个窗口的概念&#xff0c;是所有视图的载体&#xff0c;不管是 Activity&#xff0c;Dialog&#xff0c;还是 Toast&#xff0c;他们的视图都是附加在 Window 上面的。例如在桌面显示一个悬浮窗&#xff0c;就需要用到 Window 来实现。Wi…

sql练习专场(一) (16-20)

第十六题&#xff1a;同时在线问题 create table sql1_16 (id int,stt string,edt string ) row format delimited fields terminated by ,; load data local inpath /home/homedata/sql_1/sql1_16.txt into table sql1_16;id stt edt 1001,2021-…

在vscode中开发运行uni-app项目

确保电脑已经安装配置好了node、vue等相关环境依赖 进行项目的创建 vue create -p dcloudio/uni-preset-vue 项目名 vue create -p dcloudio/uni-preset-vue uni-app 选择模版 这里选择【默认模版】 项目创建成功后在vscode中打开 第一次打开项目 pages.json 文件会报错&a…

多线程案例---阻塞队列

1. 阻塞队列 阻塞队列是一种特殊的队列&#xff0c;也遵守 " 先进先出 " 的原则。 阻塞队列是一种线程安全的数据结构&#xff0c;并且具有以下特性&#xff1a; 1. 当队列为满时&#xff0c;继续进行入队列操作就会阻塞&#xff0c;直到有其他线程从队列中取走元素…

【CANOE】【学习】【诊断功能】功能寻址和物理寻址

文章目录 前言一、功能寻址和物理寻址是什么&#xff1f;二、说明三、在脚本Capl里面进行使用 前言 这边文章我们将要学习和理解功能寻址和物理寻址。 一、功能寻址和物理寻址是什么&#xff1f; 可以很简单的一句话去理解&#xff1a; 物理寻址&#xff1a;是每个ECU的物理…

VisionPro —— CogIPOneImgeTool工具详解

CogIPOneImageTool工具主要用来对单张图像进行算法处理操作 CogIPOneImgeTool简介 CogIPOneImageTool 工具可完成高斯平滑、高通滤波和图像量化等基本图像处理操作。Image Processing One Image 工具编辑控件为此工具提供图形用户界面。 Image Processing Operations (图像处…

从分析Vue实例生命周期开始,剖析Vue页面跳转背后执行过程

文章目录 1.概要2.Vue实例生命周期3.生命周期函数解释4.存在父子组件情况页面执行过程5. 分析路由跳转页面执行过程6.扩展补充7.小结 1.概要 本文旨在分析Vue页面进行路由切换时&#xff0c;Vue背后的运行过程&#xff0c;旨在让大家更加清晰地明白Vue页面运行过程中钩子方法的…

43.第二阶段x86游戏实战2-提取游戏里面的lua

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 本次游戏没法给 内容参考于&#xff1a;微尘网络安全 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要…

是时候用开源降低AI落地门槛了

过去三十多年&#xff0c;从Linux到KVM&#xff0c;从OpenStack到Kubernetes&#xff0c;IT领域众多关键技术都来自开源。开源技术不仅大幅降低了IT成本&#xff0c;也降低了企业技术创新的门槛。 那么&#xff0c;在生成式AI时代&#xff0c;开源能够为AI带来什么&#xff1f;…

xlwings,让excel飞起来!

excel已经成为必不可少的数据处理软件&#xff0c;几乎天天在用。python有很多支持操作excel的第三方库&#xff0c;xlwings是其中一个。 关于xlwings xlwings开源免费&#xff0c;能够非常方便的读写Excel文件中的数据&#xff0c;并且能够进行单元格格式的修改。 xlwings还…

【分布式事务】二、NET8分布式事务实践: DotNetCore.CAP 框架 、 消息队列(RabbitMQ)、 数据库(MySql、MongoDB)

介绍 [CAP]是一个用来解决微服务或者分布式系统中分布式事务问题的一个开源项目解决方案, 同样可以用来作为 EventBus 使用 github地址:https://github.com/dotnetcore/CAP官网地址: https://cap.dotnetcore.xyz/官网文档:https://cap.dotnetcore.xyz/userguide/zh/cap/id…

【论文阅读】Learning dynamic alignment via meta-filter for few-shot learning

通过元滤波器学习动态对齐以实现小样本学习 引用&#xff1a;Xu C, Fu Y, Liu C, et al. Learning dynamic alignment via meta-filter for few-shot learning[C]//Proceedings of the IEEE/CVF conference on computer vision and pattern recognition. 2021: 5182-5191. 论文…

IDEA 2024使用mybatisplus插件生成代码在项目中

在IDEA 插件市场搜索“mybatisplus”插件并安装&#xff0c;安装好后重启IDEA&#xff0c;安装过程网上很多教程&#xff0c;这里略过&#xff1b;IDEA 2024配置数据库和生成代码迁移到了Tools菜单下&#xff0c;原先版本在Other; 先完成数据库配置&#xff0c;点击Config Data…

Android CCodec Codec2 (十九)C2LinearBlock

在上一篇文章的结尾&#xff0c;我们看到fetchLinearBlock方法最终创建了一个C2LinearBlock对象。这一节&#xff0c;我们将深入了解C2LinearBlock是什么&#xff0c;它的作用是什么&#xff0c;以及它是如何被创建的。 1、_C2BlockFactory 先对上一篇文章的结尾内容做简单回顾…

LabVIEW离心泵性能优化测试系统

开发了一套基于LabVIEW平台开发的离心泵性能优化测试系统。系统集成了数据采集、流量控制、数据存储、报表生成等功能&#xff0c;提供了低成本、便捷操作的解决方案&#xff0c;适用于工业场景中对离心泵性能的精确测评。 项目背景 随着工业化进程的加速&#xff0c;离心泵在…

【NLP自然语言处理】深入探索Self-Attention:自注意力机制详解

目录 &#x1f354; Self-attention的特点 &#x1f354; Self-attention中的归一化概述 &#x1f354; softmax的梯度变化 3.1 softmax函数的输入分布是如何影响输出的 3.2 softmax函数在反向传播的过程中是如何梯度求导的 3.3 softmax函数出现梯度消失现象的原因 &…

MML 中使用 libevent +std::async unix socket domain 进程间通信

可以执行大量超时的接口,直到任务执行完成 还可以在一个事件做检测&#xff0c;funtcure 中的值为ready 状态 uds 的用法和tcp 类似&#xff0c;会维护一个链接状态和分配一个链接套接字,这就为异步执行提供了很方便的条件 客户端就安静的做一个计时,看是否在固定事件内返回执行…