小黑今天上午着急忙慌实习公司楼下笔试,晚上准备和尚香疯狂星期四明天继续现场笔试的leetcode之旅:1091. 二进制矩阵中的最短路径

文章讲述了两种不同的方法来解决在二进制矩阵中寻找从起点到终点最短路径的问题。第一种是基于广度优先搜索的队列操作,第二种是利用A*算法优化搜索效率。两种方法都涉及到判断矩阵中的障碍物和边界条件,并且在遇到终点时返回路径长度。此外,文章还穿插了作者日常生活的点滴。

小黑代码1

class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        # 一定无解的情况
        if grid[0][0] == 1 or grid[-1][-1] == 1:
            return -1
        # 矩阵长度
        n = len(grid)
        # 起点即终点
        if n == 1:
            return 1
        # 访问集合
        seen = {(0, 0)}
        # 初始化队列
        q = collections.deque([[(0,0), 1]])
        # 开始进行队列操作
        while q:
            # 出队
            top = q.popleft()
            pos = top[0]
            dis = top[1]
            # 八个方向尝试
            for di in [[1, 0], [0, 1], [1, 1], [-1, 0], [0, -1], [-1, -1], [1, -1], [-1, 1]]:
                # 构造坐标
                pos_x = pos[0] + di[0]
                pos_y = pos[1] + di[1]
                # 判断是否出界以及有障碍物
                if 0 <= pos_x < n and 0 <= pos_y < n and (pos_x, pos_y) not in seen and not grid[pos_x][pos_y]:
                    # 到达终点
                    if pos_x == pos_y == n - 1:
                        return dis + 1
                    q.append(((pos_x, pos_y), dis + 1))
                    seen.add((pos_x, pos_y))
        return -1            

在这里插入图片描述

小黑代码2

# A*算法类
class Astar(object):
    def __init__(self, status, target, g):
        self.status = status
        self.target = target
        self.g = g
        self.h = Astar.getH(status, target)
        self.f = self.g + self.h
    @staticmethod
    def getH(status, target):
        print(status)
        dis_x = abs(status[0]-target[0])
        dis_y = abs(status[1]-target[1])
        
        return max(dis_x, dis_y)
    # 排序函数
    def __lt__(self, other):
        if self.f == other.f:
            return self.g < other.g
        return self.f < other.f
class Solution:
    def shortestPathBinaryMatrix(self, grid: List[List[int]]) -> int:
        # 一定无解的情况
        if grid[0][0] == 1 or grid[-1][-1] == 1:
            return -1
        # 数组长度
        n = len(grid)
        # 起点即是终点的情况
        if n == 1:
            return 1
        # 初始化优先队列
        q = [Astar((0, 0), (n-1, n-1), 1)]
        # 访问数组
        visited = set()
        # 开始进行A*算法迭代
        while q:
            # “假设距离”最近的出队
            top = heapq.heappop(q)
            status = top.status
            g = top.g
            if status in visited:
                continue
            visited.add(status)
            # 8个方向
            for di in [(-1,-1), (1,0), (0,1), (-1,0), (0,-1), (1,1), (1,-1), (-1,1)]:
                # 构造心得坐标
                new_pos = [0, 0]
                new_pos[0] = status[0] + di[0]
                new_pos[1] = status[1] + di[1]
                new_pos = (new_pos[0], new_pos[1])
                # 准入条件:未出界+无障碍+没走过
                if 0 <= new_pos[0] < n and 0 <= new_pos[1] < n and not grid[new_pos[0]][new_pos[1]]:
                    # 是否到终点
                    if new_pos[0] ==new_pos[1] == n - 1:
                        return g + 1
                    # 入队列
                    heapq.heappush(q, Astar(new_pos, (n-1, n-1), g + 1))
        return -1

在这里插入图片描述

小黑生活

晚饭吉野家宫保鸡丁套餐

在这里插入图片描述

琴房又没开门又没练成琴,难受,来个烤冷面

在这里插入图片描述

来一小时按摩

在这里插入图片描述

回家一瓶勇闯天涯+牛排

在这里插入图片描述
在这里插入图片描述

早上公司楼底下太平洋咖啡,顺便笔试,然后飞速去实习

在这里插入图片描述
在这里插入图片描述

午饭吉野家牛肉饭

在这里插入图片描述

期待晚上跟尚香的疯狂星期四

在这里插入图片描述

公司里来了只猫咪,好可爱呀

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

抢到了同仁医院的号

在这里插入图片描述

半马领物单出来了

在这里插入图片描述

晚饭麦当劳牛堡

在这里插入图片描述
在这里插入图片描述

回去找尚香的疯狂星期四+DQ冰激凌+骑车吹风,生活要有仪式感

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

早餐宇飞牛肉面啦

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

上午笔试,感觉好难啊,之后喝杯喜茶

在这里插入图片描述
在这里插入图片描述

下午和动哥去按摩+足疗,喝杯DQ

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

花500+买的便携屏幕到了,虽然质量不符合预期,但是也还能用,以后咖啡厅学习可以边看课边敲代码啦

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

晚上两个半小时的笔试

在这里插入图片描述

算法题一直出bug了,小黑去潘家园图书馆调试

在这里插入图片描述
在这里插入图片描述

打印比赛承诺书,跟尚香奥林匹克公园约学习啦

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

到达弥远咖啡,继续调试bug

在这里插入图片描述
在这里插入图片描述

晚饭肯德基全鸡+牛堡

在这里插入图片描述
在这里插入图片描述

北京难得的蓝色啦,走在奥体景观大道上真舒服,去领物资

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

去附近骑个车,喝杯茶百道

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

早餐牛排,出发半程马拉松

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

鸣枪起跑啦,这个天气跑得相当舒服

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

回去的地铁上人好多啊

在这里插入图片描述
在这里插入图片描述

回家后报名了一个多月后的密云马拉松,跑起来~

在这里插入图片描述

又增添了一块奖牌

在这里插入图片描述
在这里插入图片描述

照片也传过来了

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下午喜茶海盐咖啡,继续想那个A*代码的bug,总算想出来啦

在这里插入图片描述

晚上和老黑们去吃串串香啦,祝贺阿黄公务员上岸

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

中老黑吃吐了

在这里插入图片描述
在这里插入图片描述

回去修个脚,完美,发博客,晚安!!

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值