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 ... 
随机推荐
- 共享USB打印机设置方法
			打印机共享 一.准备 所有计算机在同一个网段. 所有计算机在同一个工作组,组名可以自定义,默认WORKGROUP. 使用超级管理员用户,目的是为了激活guest用户.验证之后可以不需要此前提. 二.主 ... 
- Spring-设计模式
			1.1开闭原则 开闭原则(open-closed principle,OCP)是指一个软件实体(如类,模块和函数)应该对扩展开放,对修改关闭.所谓的开闭,也正是对扩展和修改两个行为的一个原则. 强调用 ... 
- Linux提权-权限升级
			特权升级是一段旅程.没有灵丹妙药,很大程度上取决于目标系统的具体配置.内核版本.已安装的应用程序.支持的编程语言.其他用户的密码是影响您通往 root shell 之路的几个关键因素 什么是特权升级? ... 
- 【读书笔记】组合计数-Tilings-引言部分
			Tilings-引言部分 目录 一些形式化定义 各种各样的Tilings例子 Example 9.1.1 Example 9.1.2 Example 9.1.3 Thurston and Lagari ... 
- 表现标准语言CSS3学习 入门+导入方式
			表现标准语言CSS3学习 入门+导入方式 如何学习: css是什么 css怎么用(快速入门) css选择器(重点+难点) 美化网页(文字.阴影.超链接.列表.渐变...) 盒子模型 浮动 定位 网页动 ... 
- Java面试——Netty
			一.BIO.NIO 和 AIO [1]阻塞 IO(Blocking I/O):同步阻塞I/O模式,当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取一些数据或者写出 ... 
- JS一切皆对象理解
			对象都是通过函数创建的 function Fn() { this.name = '王福朋'; this.year = 1988; } var fn1 = new Fn(); fn1是个对象,它是由函数 ... 
- sorted、返回函数、匿名函数、装饰器、偏函数
			1.sorted()排序方法,它可已经一个列表按照升序排序,也可以按照反序排序 1)如果要进行反序排序时,需要在函数里面设置reverse = True 2)sorted是一个高阶函数,它接受函数作为 ... 
- 创建SVN和设置密码以及SVN自动更新
			重新创建版本库: svnadmin create /usr/local/svn/month_exam //创建一个svn版本仓库month_exam(month_exam可以随便起名字) cd ... 
- TS(一)环境搭建与基本类型
			1 TypeScript 环境搭建 1 准备NodeJs环境 2 npm全局安装typeScript npm i -g typescript 3 编写一个ts文件 4 使用tsc命令编译ts文件为js ... 
