行走的机器人

题目描述

Bob 对机器人进行了编程,让它在平面迷宫中行走。

迷宫有一些障碍。 空单元格由字符"."表示,障碍物由"#"表示。

迷宫中只有一个机器人。 它的起始位置用字符"S"表示。 这个位置没有任何障碍。 迷宫中也只有一个出口,用字符"E"表示。 这个位置没有任何障碍。

机器人只能向上、向左、向右或向下移动。

Bob 给机器人编程时,写下了一串整数,由1,2,3,4其中若干个组成。 他打算让每个数字对应一个不同的方向,机器人会按照指示到达出口。 不幸的是,他忘记了每个数字分配的是什么方向

机器人会自动将1,2,3,4随机映射到不同方向,然后按照给定的指令顺序进行操作。如果指令导致机器人离开迷宫边缘或撞到障碍物,机器人就会崩溃。如果机器人在任意时刻到达出口,那么机器人将停止且不执行后续指令。

Bob 想确定有多少种不同的方向映射方案能够将机器人到达出口

输入格式

第一行输入两个整数 n 和 m,表示迷宫行数和列数。

接下来的  n 行每行恰好包含 m 个字符,表示迷宫。

迷宫中的每个字符都是".", "#", "S"或"E"。

迷宫中将恰好有一个"S"和一个"E"。

最后一行将包含一个字符串s ,表示给机器人的指令。

输出格式

输出一个整数,表示能够让机器人到达出口的方向映射方案数。

样例

样例输入1

5 6 

.....#

S....#

.#....

.#....

...E..

333300012

样例输出1

1  

样例输入2

6 6 

......

......

..SE..

......

......

......

01232123212302123021

样例输出2

14

这道题肯定用搜索

首先四个数不同方向肯定要用到全排列

所以先把全排列的代码写出来

void dfs(int step){for(int i=0;i<4;i++){if(vis[i]==0){vis[i]=1;q[step]=i;dfs(step+1);vis[i]=0;}}
}

然后有了全排列,这道题就好做了,接下来就是按照输入的指令来模拟就行了。

首先在输入地图的时候就找好起点S的位置,然后把指令遍历一遍,用方向数组移动就行了

注意边界判断,x<1,y<1,x>n,y>m的时候都不行,还有遇到障碍物a[x][y]=='#'的时候,直接return

完整代码如下:

#include<bits/stdc++.h>
using namespace std;
const int N=55;
int n,m;
char a[N][N];
struct node{int x,y;
}first;
string s;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
int q[4]={0,0,0,0};
bool vis[4];
int len;
int sum;
void dfs(int step){if(step==4){int fx=first.x,fy=first.y;for(int i=0;i<len;i++){fx+=dx[q[s[i]-'0']];fy+=dy[q[s[i]-'0']];if(fx>n||fy>m||fx<1||fy<1||a[fx][fy]=='#')return;if(a[fx][fy]=='E'){sum++;return;}}}for(int i=0;i<4;i++){if(vis[i]==0){vis[i]=1;q[step]=i;dfs(step+1);vis[i]=0;}}
}
signed main(){scanf("%d %d",&n,&m);for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){scanf("%c",&a[i][j]);if(a[i][j]=='S'){first.x=i;first.y=j;}}}cin>>s;len=s.length();dfs(0);printf("%d",sum);
}

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

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

相关文章

<Linux> 线程的同步与互斥

目录 前言&#xff1a; 一、资源共享问题 &#xff08;一&#xff09;多线程并发访问 &#xff08;二&#xff09;临界资源与临界区 &#xff08;三&#xff09;“锁” 是什么 二、多线程抢票场景 &#xff08;一&#xff09;并发抢票 &#xff08;二&#xff09;并发访…

Segment Routing IPv6简介

定义 SRv6&#xff08;Segment Routing IPv6&#xff0c;基于IPv6转发平面的段路由&#xff09;是基于源路由理念而设计的在网络上转发IPv6数据包的一种协议。SRv6通过在IPv6报文中插入一个路由扩展头SRH&#xff08;Segment Routing Header&#xff09;&#xff0c;在SRH中压…

Ubuntu下安装microk8s用代理解决无法拉取镜像问题

首先安装microk8s: sudo snap install microk8s --classic得到输出&#xff1a; microk8s (1.28/stable) v1.28.7 from Canonical✓ installed设置 K8s 命令别名&#xff08;alias&#xff09; MicroK8s 支持的命令中&#xff0c;我们会相对高频的使用 microk8s.kubectl 这个…

渗透测试与HTTP中的PUT请求

PUT 请求用于向服务器更新指定资源&#xff0c;可以理解为对服务器上的资源进行修改操作。使用 PUT 请求方式会覆盖原有的资源内容&#xff0c;因此需要谨慎使用。 在渗透测试中&#xff0c;有可能服务端会暴露PUT请求的api&#xff0c;如修改用户权限的api&#xff0c;例如HT…

蓝桥杯练习系统(算法训练)ALGO-971 比较

资源限制 内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述 给出一个n长的数列&#xff0c;再进行m次询问&#xff0c;每次询问询问两个区间[L1,R1]&#xff0c;[L2,R2]&#xff0c;  …

HarmonyOS NEXT应用开发—Grid和List内拖拽交换子组件位置

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

数据可视化-ECharts Html项目实战(1)

在之前的文章中&#xff0c;我们学习了如何安装Visual Studio Code并下载插件&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 安装 Visual Studio…

一个服务出现fullgc正常吗 少量的fullgc会影响系统的稳定性吗

在Java应用的运行过程中&#xff0c;发生Full GC是正常的&#xff0c;因为它是JVM垃圾回收机制的一部分。Java虚拟机会定期进行垃圾回收以回收不再被使用的对象所占用的内存。然而&#xff0c;频繁的Full GC或者过长的GC暂停时间是不理想的&#xff0c;因为它会导致应用程序在垃…

网络管理基础

Linux网络管理 1.网络管理概念 网络接口和名称 &#xff1a;网卡 ip地址 网关 主机名称 路由2.管理工具 net-tools: #安装包 ifconfig netstat 准备要废掉了。iproute: #安装包 ip #提供ip命令3.认识网卡 lo网卡 :本地回环网卡&#xff0c;本机上的服务自己访问自…

MySQL安装(Mac系统)

首先要删除本机原有的mysql 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop不放心可以使用以下命令查询并杀死进程 ps aux | grep mysqld sudo kill <PID>再次尝试停止服务 sudo /usr/local/mysql/support-files/mysql.server stop卸载MySQL&…

【python开发】并发编程(上)

并发编程&#xff08;上&#xff09; 一、进程和线程&#xff08;一&#xff09;多线程&#xff08;二&#xff09;多进程&#xff08;三&#xff09;GIL锁 二、多线程开发&#xff08;一&#xff09;t.start()&#xff08;二&#xff09;t.join()&#xff08;三&#xff09;t.…

Golang协程详解

一.协程的引入 1.通过案例文章引入并发,协程概念 见:[go学习笔记.第十四章.协程和管道] 1.协程的引入,调度模型&#xff0c;协程资源竞争问题 通过上面文章可以总结出Go并发编程原理: 在一个处理进程中通过关键字 go 启用多个协程&#xff0c;然后在不同的协程中完成不同的子任…

Elasticsearch 主副分片切换过程中对业务写入有影响吗

&#x1f34a;&#x1f349;&#x1f34b; 先说下结论&#xff0c;只要集群中的工作节点过半&#xff0c;有候选的master节点&#xff0c;挂掉的节点中不同时包含索引的主分片和副分片&#xff0c;那么ES是可以做到让业务无感知的进行主副分片切换的。 蓝胖子会先讲解下ES集群写…

Spring Cloud Alibaba微服务从入门到进阶(六)(声明式HTTP客户端-Feign)

Feign是Netflix开源的声明式HTTP客户端&#xff08;只要声明一个接口&#xff0c;Feign就会通过你定义的接口自动给你构造请求的目标地址&#xff0c;并帮助你请求&#xff09; 用Feign重构前面RestTemplate方式的服务间调用 想回顾一下RestTemplate调用 加依赖 项目集成Feig…

最细节操作 Linux LVM 逻辑卷管理

Linux LVM&#xff08;逻辑卷管理&#xff09; 周末愉快&#xff0c;今天带大家实战一下LVM! 一、LVM理论 LVM&#xff0c;即Logical Volume Manager&#xff0c;逻辑卷管理器&#xff0c;是一种硬盘的虚拟化技术&#xff0c;可以允许用户的硬盘资源进行灵活的调整和动态管理…

2025武忠祥考研数学,视频百度网盘+基础全程课程PDF

“得数学者的天下”&#xff0c;25考研首先要开始的就是数学复习&#xff0c;而数学复习首先要开始的必然是高数&#xff01; 很多同学选择了跟着武忠祥老师学习高数&#xff0c;但是具体要怎么学&#xff1f;用什么书&#xff1f;怎么刷题&#xff1f;快来看看以 下的武忠祥…

广东省活动积温空间分布数据

广东省是中国大陆南端沿海的一个省份&#xff0c;位于南岭以南&#xff0c;属于东亚季风区&#xff0c;从北向南分别为中亚热带、南亚热带和热带气候&#xff0c;是中国光、热和水资源最丰富的地区之一。年平均气温约为19℃~24℃&#xff0c;1月平均气温约为16℃~19℃&#xff…

【运维】StarRocks数据迁移到新集群(针对于集群互通、不互通的情况)

文章目录 一. 迁移整体思路1. 对于新旧集群互通的情况2. 对于新旧集群不互通的情况 二、迁移过程&#xff08;两个集群互通的情况&#xff09;1. 备份过程1.1. 通过mysqlclient与starrocks进行关联1.2. 创建仓库与minio建立联系1.3. 备份数据到minio 2. 迁移过程2.1. 通过mysql…

YOLOv9改进策略:注意力机制 | 极化自注意力Polarized Self-Attention,效果秒杀CBAM、SE

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a;本文针对Pixel-wise regression的任务&#xff0c;提出了一种更加精细的双重注意力机制——极化自注意力&#xff08;Polarized Self-Attention&#xff09;&#xff0c;效果优于CBAM、SE等经典注意力。 yolo…

R语言实现中介分析(1)

中介分析&#xff0c;也称为介导分析&#xff0c;是统计学中的一种方法&#xff0c;它用于评估一个或多个中介变量&#xff08;也称为中间变量&#xff09;在自变量和因变量之间关系中所起的作用。换句话说&#xff0c;中介分析用于探索自变量如何通过中介变量影响因变量的机制…