来自北大算法课的Leetcode题解:1210. 穿过迷宫的最少移动次数

该代码实现了一个Python类Solution,通过动态规划方法解决了一道关于蛇在迷宫中移动的题目。关键在于只考虑蛇尾的位置,用二维状态数组dp表示蛇头的状态。算法遍历迷宫,更新dp数组,寻找最小移动次数。最后返回从起点到终点的最短路径步数或返回-1表示无法到达终点。
摘要由CSDN通过智能技术生成

代码仓库Github | Leetcode solutions @doubleZ0108 from Peking University.

  • 解法1(T7% S97%):一看走迷宫马上想到应该是动态规划,但这题的难点在于蛇有两个长度,蛇头蛇尾动来动去很麻烦,因此我们不妨只考虑蛇尾的位置,而将蛇头的位置转换为蛇的状态status,分别是水平和竖直,这样我们依然可以通过类二维dp数组来做,只不过数组的每一位有两种可能的status。将每种情况在纸上画出来然后写代码就好,需要注意的是,旋转的2种情况要在4种平移全结束之后再写,否则由于dp还没更新到(i,j)位置导致一直为Infinity

IMG_D7E9B6A53384-1.jpeg

class Solution:
    def minimumMoves(self, grid: List[List[int]]) -> int:
        n = len(grid)
        dp = [[[float('inf'), float('inf')] for _ in range(n)] for _ in range(n)]
        dp[0][0][0] = 0

        for i in range(n):
            for j in range(n):
                if j+1<n and grid[i][j]==0 and grid[i][j+1]==0:
                    if i-1>-1:
                        dp[i][j][0] = min(dp[i][j][0], dp[i-1][j][0]+1)
                    if j-1>-1:
                        dp[i][j][0] = min(dp[i][j][0], dp[i][j-1][0]+1)
                    
                
                if i+1<n and grid[i][j]==0 and grid[i+1][j]==0:
                    if i-1>-1:
                        dp[i][j][1] = min(dp[i][j][1], dp[i-1][j][1]+1)
                    if j-1>-1:
                        dp[i][j][1] = min(dp[i][j][1], dp[i][j-1][1]+1)


                if i+1<n and j+1<n and grid[i][j]==0 and grid[i][j+1]==0 and grid[i+1][j+1]==0:
                        dp[i][j][0] = min(dp[i][j][0], dp[i][j][1]+1)
                if j+1<n and i+1<n and grid[i][j]==0 and grid[i+1][j]==0 and grid[i+1][j+1]==0:
                    dp[i][j][1] = min(dp[i][j][1], dp[i][j][0]+1)

        return dp[n-1][n-2][0] if dp[n-1][n-2][0]<float('inf') else -1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

doubleZ0108

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值