Re: [闲聊] 每日LeetCode

楼主: Rushia (みけねこ的鼻屎)   2023-01-24 18:38:07
909. Snakes and Ladders
给你一个board[][]矩阵表示一个棋盘,蛇梯棋是一个游戏他有着以下规则:
1.每次投一个骰子并且走1~6步,只能往编号更高的地方走不能回头
2.若该格子碰到蛇,一定要往前退到某一格
3.若该格子碰到梯子,一定要往上到某一格
4.起点在棋盘的左下,终点在棋盘的左上,棋盘的编号为Z字型排列
假定我们的骰子可以自由的决定走1~6其中的任意步数,求出我们最少要投几次骰
子才能到达终点,若无法到达终点则返回-1。
注:梯子和蛇以数字表示,若该格子为-1则表示没有蛇也没有梯子
Exaple:
https://assets.leetcode.com/uploads/2018/09/23/snakes.png
Input: board =
[[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,-1,-1,-1,-1,-1],[-1,35,-1,-1,13,-1],[-1,-1,-1,-1,-1,-1],[-1,15,-1,-1,-1,-1]]
Output: 4
投一次骰子并走到第2格,遇到梯子爬到第15格
投一次骰子并走到第17格,遇到蛇退回13格
投一次骰子投一次骰子到14格,遇到梯子爬到35格
投一次骰子并走到36格(终点)
思路:
1.一开始本来是想用动态规划求解但是怎么求状态转移方程都怪怪的,只能改用DFS
或BFS这方面想,因为是求最短路径所以一定是用BFS最好。
2.BFS的选择可以是骰子投1~6,把下一个square的座标丢回queue里面,并且每一轮
结束的时候 move + 1。
3.有两个点需要特别处理,一是可能出现循环(六个格子都是蛇)所以我们需要用一个
visited来排除掉已经走过的点,若已经走过就不继续丢回queue。
4.第二个比较麻烦的是square的编号需要和board对应(z字型)所以每次察看棋盘前
都要先把当前座标做一次转换。
5.若超出格子的时候break,若当前点等于终点的座标则提前返回(因为是BFS所以
遇到的第一个解必定是最短路径)
Java Code:
作者: SecondRun (雨夜琴声)   2023-01-24 18:40:00
大师看题目就觉得好懒
作者: iLeyaSin365 (伊雷雅鑫)   2023-01-24 18:42:00
真复杂
作者: pandix (面包屌)   2023-01-24 19:12:00
大师

Links booklink

Contact Us: admin [ a t ] ucptt.com