LC1293.网格中的最短路径(BFS)

使用BFS算法解决网格中求最短路径的问题,考虑障碍物消除次数K的影响。通过队列进行广度优先搜索,每个节点代表点i,j剩余消除数k的状态。在扩展过程中更新最短路径,并判断消除数是否足够,不足则跳过当前状态。自定义结构体存储三个关键状态:坐标和消除数。" 135219667,15017112,提升效率:Microsoft Edge必备的8大扩展,"['浏览器扩展', '安全工具', '项目管理', '写作辅助', '效率工具']
摘要由CSDN通过智能技术生成

问题

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

解题

  • 题干中的求最短距离,先想到BFS,然后用BFS+队列实现
  • 又由于题干中需要维护一个花费值K,如果假设K为每个格子还能移除K个障碍物,则每个格子都可能有K个状态,用visited[i][j][k]表示点i,j格子还能消除k个障碍物的状态是否出现过。
  • 用step维护最短路径,类似于树的层序遍历,每次扩展一层,该层的step比上一层+1.
  • 如果扩展到的点为0,则剩下的消除数rest不变,否则-1,如果rest<0则跳过这个状态
  • 注意:这里需要维护三个状态,横纵坐标以及该点的消除数K,因此需要自定义结构体
class Solution {
   
    int m, n;
    public int shortestPath(int[][] grid, int k) {
   
        this.m = grid.length;
        this.n = grid[0].length;
        if(m <= 1 && n <= 1) return 0;
        Queue<Status> queue = new LinkedList<>();
        boolean[][][
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值