栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode 2022春季赛 2. 信物传送(迪杰斯特拉-最短路径)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode 2022春季赛 2. 信物传送(迪杰斯特拉-最短路径)

文章目录
    • 1. 题目
    • 2. 解题

1. 题目

欢迎各位勇者来到力扣城,本次试炼主题为「信物传送」。

本次试炼场地设有若干传送带,matrix[i][j] 表示第 i 行 j 列的传送带运作方向,"^","v","<",">" 这四种符号分别表示 上、下、左、右 四个方向。
信物会随传送带的方向移动。勇者每一次施法操作,可临时变更一处传送带的方向,在物品经过后传送带恢复原方向。

通关信物初始位于坐标 start处,勇者需要将其移动到坐标 end 处,请返回勇者施法操作的最少次数。

注意:
start 和 end 的格式均为 [i,j]

示例 1:
输入:matrix = [">>v","v^<","<><"], 
start = [0,1], end = [2,0]
输出:1
解释:
如上图所示
当信物移动到 [1,1] 时,勇者施法一次将 [1,1] 的传送方向 ^ 从变更为 <
从而信物移动到 [1,0],后续到达 end 位置
因此勇者最少需要施法操作 1 次

示例 2:
输入:matrix = [">>v",">>v","^<<"], 
start = [0,0], end = [1,1]
输出:0
解释:勇者无需施法,信物将自动传送至 end 位置

示例 3:
输入:matrix = [">^^>","<^v>","^v^<"], 
start = [0,0], end = [1,3]
输出:3

提示:
matrix 中仅包含 '^'、'v'、'<'、'>'
0 < matrix.length <= 100
0 < matrix[i].length <= 100
0 <= start[0],end[0] < matrix.length
0 <= start[1],end[1] < matrix[i].length

https://leetcode-cn.com/contest/season/2022-spring/problems/6UEx57/

2. 解题
  • 迪杰斯特拉,最短路径
typedef pair pii;
struct cmp{
    bool operator()(pii& a, pii& b) const
    {
        return a.first > b.first;
    }
};
class Solution {
    vector> dir = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
public:
    int conveyorBelt(vector& matrix, vector& start, vector& end) {
        int m = matrix.size(), n = matrix[0].size();
        vector> mindis(m, vector(n, INT_MAX));
        priority_queue, cmp> q;
        q.push({0, start[0]*128+start[1]}); 
        // 存储到该点的最小施法次数,压缩的位置信息
        mindis[start[0]][start[1]] = 0;
        while(!q.empty())
        {
            auto tp = q.top();
            q.pop();
            int time = tp.first, x = tp.second/128, y = tp.second%128;
            if(x==end[0] && y==end[1])
                return time;
            for(int i = 0; i < 4; ++i)
            {
                int nx = x+dir[i][0], ny = y+dir[i][1];
                if(nx>=0 && nx=0 && ny
                    if((matrix[x][y]=='^' && i==0) || (matrix[x][y]=='v' && i==1) || 
                      (matrix[x][y]=='<' && i==2) || (matrix[x][y]=='>' && i==3))
                    { // 不施法就能走过来,且是更优的走法
                        if(time < mindis[nx][ny])
                        {
                            q.push({time, nx*128+ny});
                            mindis[nx][ny] = time;
                        }
                    }
                    else
                    {  // 需要施法才能走过来,且是更优的走法,次数+1 
                        if(time+1 < mindis[nx][ny])
                        {
                            q.push({time+1, nx*128+ny});
                            mindis[nx][ny] = time+1;
                        }
                    }
                }
            }
        }
        return -1;
    }
};

我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/832387.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号