1. 问题描述:

有一个 n × m 个单元格构成的迷宫,其中空单元格用 . 表示,障碍物用 # 表示。迷宫中有一个机器人,它的起点位置用 S 表示,目标位置用 E 表示,这两个地点均没有障碍。机器人只能沿上下左右四个方向移动。给定一串由数字 0∼3 构成的字符串,表示机器人的行动指令列表。机器人将按照列表中的指令,依次进行移动。在执行指令的过程中:
如果机器人走出迷宫边界或者碰到障碍物,则机器人会损坏。
如果机器人到达目标位置,则停止行动,不再接受后续指令。
现在,哪个数字(0∼3)对应哪种行动(上下左右)还未分配。
请问,共有多少种分配方案,能够使得机器人顺利到达目标位置。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。每组数据第一行包含两个整数 n 和 m。接下来 n 行,每行包含 m 个字符,表示迷宫。所有字符均为 ., #,,S, E 之一,其中 S 和 E 出现且仅出现一次。最后一行包含一个字符串 s 表示指令列表,每个字符均为 0∼3 之一。

输出格式

每组数据输出一行结果,表示能够使得机器人顺利到达目标位置的行动指令分配方案数量。

数据范围

前三个测试点满足 2 ≤ n, m ≤ 10。
所有测试点满足 1 ≤ T ≤ 10,2 ≤ n,m ≤ 50,1 ≤ |s| ≤ 100。
同一测试点内,所有 n × m 的和不超过 2500。

输入样例:

2
5 6
.....#
S....#
.#....
.#....
...E..
333300012
6 6
......
......
..SE..
......
......
......
01232123212302123021

输出样例:

1
14
来源:https://www.acwing.com/problem/content/description/3815/

2. 思路分析:

因为0~3对应的上下左右四个方向是不确定的所以我们可以枚举所有的可能,总的方案数目为4的全排列也即有24种可能,所以我们可以枚举24种不同的方向,可以使用递归交换元素的方法生成[0,1,2,3]的全排列,然后枚举所有的排列,判断s按照当前排列对应的方向执行是否可以到达终点,如果可以到达终点那么计数加1即可。

3. 代码如下:

from typing import Listclass Solution:pos = [[0, 1], [0, -1], [1, 0], [-1, 0]]# 交换元素生成全排列def get(self, k: int, a: List[int], res: List[List[int]]):if k == 4:# a[:]为拷贝a的副本, 将其添加到res中res.append(a[:])returnfor i in range(k, 4):a[i], a[k] = a[k], a[i]self.get(k + 1, a, res)# 恢复现场a[i], a[k] = a[k], a[i]def check(self, n: int, m: int, x: List[int], s: str, start: List[int], end: List[int], g: List[List[str]]):a, b = start[0], start[1]for i in range(len(s)):k = int(s[i])a, b = a + self.pos[x[k]][0], b + self.pos[x[k]][1]if a < 0 or a >= n or b < 0 or b >= m or g[a][b] == "#": return False# 说明到达了终点if a == end[0] and b == end[1]: return Truereturn a == end[0] and b == end[1]def process(self):a = [0, 1, 2, 3]res = list()# 生成a的所有全排列self.get(0, a, res)T = int(input())while T:n, m = map(int, input().split())g = list()# start, end记录起点和终点的坐标start, end = [-1, -1], [-1, -1]for i in range(n):s = input()g.append(list(s))for j in range(m):if s[j] == "S":start[0], start[1] = i, jif s[j] == "E":end[0], end[1] = i, js = input()count = 0for x in res:# 判断当前设置的方向是否可以到达终点if self.check(n, m, x, s, start, end, g):count += 1print(count)T -= 1if __name__ == '__main__':Solution().process()

3812 机器人走迷宫(枚举 + 全排列)相关推荐

  1. Acwing 3812.机器人走迷宫【全排列】

    1.题目描述 题目链接:点击这里 2.解决思路 只需要考虑,不管是什么序列,可选方案最多24种(4!种)所以我们只需要用next_permutation搞出0123的全排列,并让它们每一个值与序列中不 ...

  2. 华为机试:机器人走迷宫

    题目来源 华为机试:机器人走迷宫 题目描述 1. 房间由XY的方格组成,例如下图为64的大小.每一个方格以坐标(x,y)描述. 2. 机器人固定从方格(0,0)出发,只能向东或者向北前进.出口固定为房 ...

  3. 【算法】机器人走迷宫(适用于走迷宫、最短路径算法)-20200412

    标题:机器人走迷宫(适用于走迷宫.最短路径算法) 问题描述: 一块矩形方格,含有障碍和可通行格子,求从某一点到另外一点的最短距离?N*M的矩阵: 其中,1代表障碍,0代表可通行:示例:给定二维矩阵 0 ...

  4. 中南大学复试上机:1021:机器人走迷宫

    1021: 机器人走迷宫 时间限制: 1 Sec  内存限制: 128 MB 题目描述 有一个愚蠢的机器人走进一个w*h的迷宫,迷宫里有空地和陷阱.他想要访问迷宫的每个方格,但是它很笨,只会按照指令的 ...

  5. python走迷宫_Python使用Tkinter实现机器人走迷宫

    这本是课程的一个作业研究搜索算法,当时研究了一下Tkinter,然后写了个很简单的机器人走迷宫的界面,并且使用了各种搜索算法来进行搜索,如下图: 使用A*寻找最优路径: 由于时间关系,不分析了,我自己 ...

  6. 【华为OD机试真题 JAVA】机器人走迷宫

    标题:机器人走迷宫 | 时间限制:1秒 | 内存限制:65536K | 语言限制:不限 1. 房间由X*Y的方格组成,例如下图为6*4的大小.每一个方格以坐标(x,y)描述. 2. 机器人固定从方格( ...

  7. 【华为机试】【校招】【Java】机器人走迷宫(DFS)

    ■ 题目描述 [机器人走迷宫] 机器人走一个迷宫,给出迷宫的x和y(x*y的迷宫)并且迷宫中有障碍物,输入k表示障碍物有k个,并且会将障碍物的坐标挨个输入. 机器人从0,0的位置走到x,y的位置并且只 ...

  8. 华为机试二星题--机器人走迷宫

    题目 机器人走一个迷宫,给出迷宫的x和y(x*y的迷宫)并且迷宫中有障碍物,输入k表示障碍物有k个,并且会将障碍物的坐标挨个输入. 机器人从0,0的位置走到x,y的位置并且只能向x,y增加的方向走,不 ...

  9. 华为机试【机器人走迷宫】

    标题:机器人走迷宫 | 时间限制:1秒 | 内存限制:65536K | 语言限制: 不限 [机器人走迷宫]1. 房间由XY的方格组成,例如下图为64的大小.每一个方格以坐标(x,y)描述. 2. 机器 ...

最新文章

  1. spring 判断非空提示断言
  2. 本地kubectl客户端连接远程K8S集群
  3. ITK:计算两个图像之间的均方度量值
  4. Querying an unbounded table ‘myhive.db1.datagen‘ in batch mode is not allowed
  5. android root 挂载分区,adb — adb disable-verity, adb remount 实现重新挂载system分区为可读写分区...
  6. 消息队列(1):一个消息队列应该有的特点
  7. springboot 修改页面不重启
  8. linux搭建phantomjs+webdriver+testng+ant自动化工程
  9. fw: 专访许鹏:谈C程序员修养及大型项目源码阅读与学习
  10. 31.卷1(套接字联网API)---流
  11. iOS 字体大小适配
  12. mysql同步 触发器_MySQL触发器运用于迁移和同步数据的实例教程
  13. netty 原理分析
  14. 144.绘制布朗运动曲线
  15. 【Java】如何导出压缩包
  16. 不要在意别人的目光,走自己的路
  17. 在ipad上的几款远程桌面工具使用体会
  18. sd卡计算机无法读取数据,电脑突然无法读取sd的起因分析sd卡无法读取怎么修复...
  19. 2022年作为一个中年程序员写给35岁的自己
  20. JavaScript问题:一张纸的厚度是0.0001米,将纸对折,对折多少次厚度超过珠峰高度8848米

热门文章

  1. 什么是UE设计?UI设计又是什么?UE和UI有什么区别?
  2. ROS小车打造(12)--Arduino订阅cmd_vel实现差速控制
  3. UVA-10347 Medians 计算几何 中线定理
  4. 我的世界服务器末地文件在哪,我的世界:找不到末地城怎么办?巧用2个操作,就能瞬间找到!...
  5. 南方电网两栖机器人_南方电网首个作业级水下机器人落户海南 为海底电缆“护驾”...
  6. vue移动端的真机测试
  7. android 直播sdk 抖音,从零开始仿写一个抖音App——跨平台视频编辑SDK项目搭建
  8. 《中国企业家》杂志:柳传志走访旧金山
  9. Alpine中文字体
  10. CTO们接着吼:创业公司几乎全是坑!