【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS

简介: 【每日一题Day218】LC1091 二进制矩阵中的最短路径 | BFS

二进制矩阵中的最短路径【LC1091】

你驾驶出租车行驶在一条有 n 个地点的路上。这 n 个地点从近到远编号为 1n ,你想要从 1 开到 n ,通过接乘客订单盈利。你只能沿着编号递增的方向前进,不能改变方向。

乘客信息用一个下标从 0 开始的二维数组 rides 表示,其中 rides[i] = [starti, endi, tipi] 表示第 i 位乘客需要从地点 starti 前往 endi ,愿意支付 tipi 元的小费。

每一位 你选择接单的乘客 i ,你可以 盈利endi - starti + tipi 元。你同时 最多 只能接一个订单。

给你 nrides ,请你返回在最优接单方案下,你能盈利 最多 多少元。

**注意:**你可以在一个地点放下一位乘客,并在同一个地点接上另一位乘客。

  • 思路常规BFS,使用队列进行BFS,搜索时记录搜索的轮数。搜索到一个可以访问的节点时,将其入队。如果搜索到终点时,直接返回当前轮数;如果队列为空仍为访问到终点,那么返回-1;
  • 访问过一个节点后,为了避免重复访问直接将给节点设置为-1
  • 实现
class Solution {
    public int shortestPathBinaryMatrix(int[][] grid) {
        // BFS
       int[][] dirs = {{0, 1}, {1, 0}, {1, 1}, {0, -1}, {-1, 0}, {-1, -1}, {1, -1}, {-1, 1}};// 8个方向?
       Deque<int[]> queue = new LinkedList<>();
       int n = grid.length;
       int count = 0;
       if (grid[0][0] == 0){
           queue.add(new int[]{0, 0});
       }
       while(!queue.isEmpty()){
           int size = queue.size();
           count++;
           for (int i = 0; i < size; i++){
                int[] p = queue.poll();
                int x = p[0], y = p[1];
                if (x == n - 1 && y == n - 1) return count;
                for (int[] dir : dirs){
                    int x1 = x + dir[0], y1 = y + dir[1];           
                    if (x1 >= 0 && y1 >= 0 && x1 <n && y1 < n && grid[x1][y1] != 1){                 
                        queue.add(new int[]{x1, y1});
                        grid[x1][y1] = 1;
                    }
                }
           }
       }
       return -1;
    }
}

image.png

目录
相关文章
|
2月前
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
34 0
|
2月前
【每日一题Day342】LC2578最小和分割 | 贪心
【每日一题Day342】LC2578最小和分割 | 贪心
25 0
|
2月前
【每日一题Day292】LC1572矩阵对角线元素的和 模拟
【每日一题Day292】LC1572矩阵对角线元素的和 模拟
18 0
|
2月前
|
人工智能 BI
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
【每日一题Day354】LC2316统计无向图中无法互相到达点对数 | 并查集
33 0
|
11月前
|
机器学习/深度学习 存储 算法
【DFS经典例题】2n皇后问题
【DFS经典例题】2n皇后问题
58 0
|
2月前
【每日一题Day255】LC2679矩阵中的和 | 排序
【每日一题Day255】LC2679矩阵中的和 | 排序
15 0
|
2月前
【每日一题Day122】LC1237找出给定方程的正整数解 | 双指针 二分查找
【每日一题Day122】LC1237找出给定方程的正整数解 | 双指针 二分查找
26 0
|
2月前
|
存储 人工智能 BI
【每日一题Day216】LC1377 T 秒后青蛙的位置 | BFS DFS
【每日一题Day216】LC1377 T 秒后青蛙的位置 | BFS DFS
32 0
|
机器学习/深度学习 Java
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索
每个数字有两种状态,删除或者未删除,因此可以使用状态压缩记录未删除的数字情况state,便于使用位运算进行状态的遍历及转移;使用状态压缩dp找到将所以数字删除的最大分数
87 0
【每日一题Day64】LC1799N 次操作后的最大分数和 | 状态压缩dp 状态压缩+dfs+记忆化搜索
|
机器学习/深度学习
【每日一题Day107】LC1145二叉树着色游戏 | dfs+贪心
现在,假设你是「二号」玩家,根据所给出的输入,假如存在一个 y 值可以确保你赢得这场游戏,则返回 true ;若无法获胜,就请返回 false 。
82 0
【每日一题Day107】LC1145二叉树着色游戏 | dfs+贪心