2022-01-31:迷宫 III。 由空地和墙组成的迷宫中有一个球。球可以向上(u)下(d)左(l)右(r)四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。迷宫中还有一个洞
2022-01-31:迷宫 III。
由空地和墙组成的迷宫中有一个球。球可以向上(u)下(d)左(l)右(r)四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。迷宫中还有一个洞,当球运动经过洞时,就会掉进洞里。
给定球的起始位置,目的地和迷宫,找出让球以最短距离掉进洞里的路径。 距离的定义是球从起始位置(不包括)到目的地(包括)经过的空地个数。通过’u’, ‘d’, ‘l’ 和 'r’输出球的移动方向。 由于可能有多条最短路径, 请输出字典序最小的路径。如果球无法进入洞,输出"impossible"。
迷宫由一个0和1的二维数组表示。 1表示墙壁,0表示空地。你可以假定迷宫的边缘都是墙壁。起始位置和目的地的坐标通过行号和列号给出。
力扣499。
答案2022-01-31:
宽度优先遍历。每走一步,都需要记录一下。
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
maze := [][]int{
{0, 0, 0, 0, 0},
{1, 1, 0, 0, 1},
{0, 0, 0, 0, 0},
{0, 1, 0, 0, 1},
{0, 1, 0, 0, 0},
}
ball := []int{4, 3}
hole := []int{0, 1}
ret := findShortestWay(maze, ball, hole)
fmt.Println(ret)
}
// 节点:来到了哪?(r,c)这个位置
// 从哪个方向来的!d -> 0 1 2 3 4
// 之前做了什么决定让你来到这个位置。
type Node struct {
r int
c int
d int
p string
}
func NewNode(row, col, dir0 int, path0 string) *Node {
ans := &Node{}
ans.r = row
ans.c = col
ans.d = dir0
ans.p = path0
return ans
}
func findShortestWay(maze [][]int, ball, hole []int) string {
n := len(maze)
m := len(maze[0])
q1 := make([]*Node, n*m)
q2 := make([]*Node, n*m)
s1 := 0
s2 := 0
visited := make([][][]bool, len(maze))
for i := 0; i < len(maze); i++ {
visited[i] = make([][]bool, len(maze[0]))
for j := 0; j < len(maze[0]); j++ {
visited[i][j] = make([]bool, 4)
}
}
s1 = spread(maze, n, m, NewNode(ball[0], ball[1], 4, ""), visited, q1, s1)
for s1 != 0 {
for i := 0; i < s1; i++ {
cur := q1[i]
if hole[0] == cur.r && hole[1] == cur.c {
return cur.p
}
s2 = spread(maze, n, m, cur, visited, q2, s2)
}
tmp := q1
q1 = q2
q2 = tmp
s1 = s2
s2 = 0
}
return "impossible"
}
var to = [][]int{{1, 0}, {0, -1}, {0, 1}, {-1, 0}, {0, 0}}
var re = []string{"d", "l", "r", "u"}
// maze迷宫,走的格子
// n 行数
// m 列数
// 当前来到的节点,cur -> (r,c) 方向 路径(决定)
// v [行][列][方向] 一个格子,其实在宽度有限遍历时,是4个点!
// q 下一层的队列
// s 下一层队列填到了哪,size
// 当前点cur,该分裂分裂,该继续走继续走,所产生的一下层的点,进入q,s++
// 返回值:q增长到了哪?返回size -> s
func spread(maze [][]int, n, m int, cur *Node, v [][][]bool, q []*Node, s int) int {
d := cur.d
r := cur.r + to[d][0]
c := cur.c + to[d][1]
// 分裂去!
if d == 4 || r < 0 || r == n || c < 0 || c == m || maze[r][c] != 0 {
for i := 0; i < 4; i++ {
if i != d {
r = cur.r + to[i][0]
c = cur.c + to[i][1]
if r >= 0 && r < n && c >= 0 && c < m && maze[r][c] == 0 && !v[r][c][i] {
v[r][c][i] = true
next := NewNode(r, c, i, cur.p+re[i])
q[s] = next
s++
}
}
}
} else { // 不分裂!继续走!
if !v[r][c][d] {
v[r][c][d] = true
q[s] = NewNode(r, c, d, cur.p)
s++
}
}
return s
}
执行结果如下:

2022-01-31:迷宫 III。 由空地和墙组成的迷宫中有一个球。球可以向上(u)下(d)左(l)右(r)四个方向滚动,但在遇到墙壁前不会停止滚动。当球停下时,可以选择下一个方向。迷宫中还有一个洞的更多相关文章
- 利用自定义动画 animate() 方法,实现某图书网站中“近 7 日畅销榜”中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠标移开时,继续滚动
查看本章节 查看作业目录 需求说明: 利用自定义动画 animate() 方法,实现某图书网站中"近 7 日畅销榜"中的图书无缝垂直向上滚动特效:当光标移入到图书上时,停止滚动,鼠 ...
- js 判断滚动条是否停止滚动
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- ionic 监听页面滚动,点击停止滚动
类似今日头条,页面上有很多card,点击每个card跳转该card的详情页面.这里有一个问题,当我滚动页面时,会先后触发touchstart.touchmove.touchend,但是当touchen ...
- marquee 滚动到文字上时停止滚动,自定义停止方法
我要实现的效果如下图:当鼠标移到续费提醒文字上时,文字滚动停止,并出现后面的关闭按钮:当鼠标移出文字时,文字继续滚动,后面的关闭按钮不显示. 在网上查到的marquee停止滚动的的代码是这样的: &l ...
- android gridview 停止滚动
http://blog.csdn.net/yaphetzhao/article/details/50544105 参考上面的博客,关键代码我就贴出来吧: public void stopGridVie ...
- [LeetCode] 499. The Maze III 迷宫 III
There is a ball in a maze with empty spaces and walls. The ball can go through empty spaces by rolli ...
- JZOJ 2022.01.21【提高A组】模拟
简要题解加心得 不得不说这是我打得比较痛苦且改得比较痛苦的一套题了 \(\text{T1 1085. [GDOI2008]彩球游戏}\) 整整改了三个半小时 直接崩溃了 明明本地可以跑过去,偏偏 \( ...
- HTML滚动字幕代码参数详解及Js间隔滚动代码
html文字滚动代码 <marquee style="WIDTH: 388px; HEIGHT: 200px" scrollamount="2" dire ...
- Debian下自动备份文件并上传到远程FTP服务器且删除指定日期前的备份Shell脚本
说明: 1.备份目录/home/osyunwei下面所有的文件到/home/osyunweibak里面,并且保存为osyunwei20120701.tar.gz的压缩文件格式(2012_07_01是 ...
- 根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一
根据PV统计出前三的热门板块,并统计出热门板块下的用户数--方式一 测试数据 java代码 package com.hzf.spark.study; import java.util.ArrayLis ...
随机推荐
- flask orm 操作方法
数据库操作 常用的查询过滤器 过滤器 说明 filter() 把过滤器添加到原查询上,返回一个新查询 filter_by() 把等值过滤器添加到原查询上,返回一个新查询 limit() 使用指定的值限 ...
- CSS伪类三角形
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Python学习笔记--布尔类型和比较运算符、if判断语句以及相关案例的实现
布尔类型和比较运算符 代码: 结果: 主要有以下几类: 注意:bool类型的真假表示开头必须大写,例如:True和False 而要是想要得到布尔类型,除了直接定义,还可以通过比较运算得到布尔类型: i ...
- Activiti7开发(二)-流程定义
目录 1.部署流程模型为流程定义 2.挂起/激活流程定义 3.删除流程定义 4.查询流程定义 5.上传并部署流程定义 6.查看流程模型 1.部署流程模型为流程定义 @PostMapping(value ...
- 【开源免费】使用Spring Boot和Html实现ChatGPT,1:亿还原,将就看
highlight: a11y-dark 简介 前段时间写了一个Chatgpt的Java版SDK开源地址:chatgpt-java欢迎使用.但由于原来OpenAI 并没有支持官网的chatgpt模型, ...
- CSS 高阶小技巧 - 角向渐变的妙用!
本文将介绍一个角向渐变的一个非常有意思的小技巧! 我们尝试使用 CSS 绘制如下图形: 在之前,类似的图案,其实我们有尝试过,在 单标签实现复杂的棋盘布局 一文中,我们用单标签实现了这样一个棋盘布局: ...
- 分布式 WEB应用中Session(会话管理)的变迁之路
一.Session 介绍 Session 一词直译为 "会话",意指有始有终的一系列动作/消息.Session 是 Web 应用蓬勃发展的产物之一.在 Web 应用中隐含有&quo ...
- 暗夜发光,独自闪耀,盘点网页暗黑模式(DarkMode)下的特效和动效,CSS3实现
众所周知,网页的暗黑模式可以减少屏幕反射和蓝光辐射,减少眼睛的疲劳感,特别是在夜间使用时更为明显.其实暗黑模式也给霓虹灯效应(Neon Effect)提供了发挥的环境. 霓虹灯效应是一种视觉效果,其特 ...
- redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to "xxxxx"
Java 连接 Redis所遇问题 1. 检查Linux是否关闭防火墙,或对外开放redis默认端口6379 关闭防火墙. systemctl stop firewalld 对外开放端口.firewa ...
- 通知短信 API 接入全流程(超详细整理)
随着移动互联网和智能手机的普及,短信成为了一种便捷.快速且有效的通信方式,尤其在向用户发送重要信息或提醒方面具有很大的优势. 本文将会深入探讨如何在程序中接入通知短信 API 实现短信通知功能,此外, ...