6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)

简介: 6366. 在网格图中访问一个格子的最少时间(dijkstra在矩阵上的运用)

题目

思路

  • 首先,这是一个最短路问题
  • 直接用朴素记忆化搜索或者bfs无法实现“反复横跳”这一功能(只有有两个点以上可以走,就可以走到任意一个有最小时间限制的点)
  • 所以更换思维,用图论的方式思考
  • 每个点到上下左右有一条特殊的边,边权值为max(1,(grid[xx][yy]−dist[x][y])/2∗2+1)max( 1 , ( grid[ xx ][ yy ] - dist[ x ][ y ] ) / 2 * 2 + 1 )max(1,(grid[xx][yy]dist[x][y])/22+1),前者是一步的权值,后者是需要“反复横跳”才能走到的位置
  • 用堆优化dijkstra方法,因为最大的grid元素不超过1e5,所以堆中的元素是有限的,走的步数也是有限的
  • 当新的最短路径长度小于dist中对应点的大小,更新dist,然后入队
  • 教训:最短路问题都可以通过优化建边的技巧来解决┭┮﹏┭┮
  • 下面方法和题解的思路有一点不同,通过观察下标得到一个重要的结论:走到一个点的步数奇偶性和下标x+y的奇偶性相同
  • 其实都是一个道理,展现出来的面不同

代码

ini

复制代码

class Solution {
    struct node
    {
        int x,y,ti;
        bool operator < (const node & t)const{
            return ti > t.ti;
        }
    };
    
public:
    int minimumTime(vector<vector<int>>& grid) {
        if(grid[0][1] > 1 && grid[1][0] > 1)
        {
            return -1;
        }
        int n = grid.size(),m = grid[0].size();
        int dx[] = {0,1,0,-1},dy[] = {1,0,-1,0};
        vector<vector<int>> dist(n,vector<int>(m,1e9));
        dist[0][0] = 0;
        priority_queue<node> q;q.push({0,0,0});
        
        while(1){
            auto[x, y, d] = q.top();
            q.pop();
            if (x == n - 1 && y == m - 1)
                return d;
            for (int i = 0;i < 4;i ++) {
                int xx = x + dx[i],yy = y + dy[i];
                if (0 <= xx && xx < n && 0 <= yy && yy < m) {
                    int nd = max(d + 1, grid[xx][yy]);
                    nd += (nd - xx - yy) % 2;
                    if (nd < dist[xx][yy]) {
                        dist[xx][yy] = nd; // 更新最短路
                        q.push({xx,yy,nd});
                    }
                }
            }
        }
        return dist[n-1][m-1];
    }
};


相关文章
|
存储 Cloud Native Linux
C++ deque底层原理
C++ deque底层原理
|
Unix Linux Shell
Linux执行shell脚本提示文件找不到问题解决办法
Linux执行shell脚本提示文件找不到问题解决办法
1424 0
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch应用实战一:实现卷积操作
PyTorch应用实战一:实现卷积操作
336 0
|
6月前
|
安全 网络安全 虚拟化
Hyper-V网络连接无响应解决方案
当Hyper-V虚拟机出现网络连接无响应时,可从以下方面排查:1) 检查物理网络连接,确保设备正常;2) 验证虚拟网络配置,包括虚拟交换机和网络适配器设置;3) 更新驱动程序以解决兼容性问题;4) 调整防火墙和安全软件设置;5) 重启相关服务和设备;6) 使用命令行工具诊断网络问题;7) 检查BIOS中虚拟化技术是否启用;8) 排查IP冲突和其他日志错误。综合以上步骤,可有效修复网络连接故障。
|
10月前
|
弹性计算 安全 Ubuntu
快速部署 Virtualmin 社区版
Virtualmin 是专为 Linux 系统设计的领先且最复杂的网络托管控制面板。本文介绍如何使用计算巢快速部署 Virtualmin 社区版。
快速部署 Virtualmin 社区版
|
网络协议
Wireshark 捕获和显示过滤器
Wireshark 捕获和显示过滤器
334 0
|
11月前
|
域名解析 缓存 网络协议
TCP传输层详解(计算机网络复习)
本文详细解释了TCP/IP协议族的分层模型、各层的功能、TCP报文的格式以及TCP连接建立的三次握手和断开的四次挥手过程。
1377 2
TCP传输层详解(计算机网络复习)
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
959 0
|
10月前
|
供应链 区块链 数据安全/隐私保护
区块链技术在供应链金融中的创新实践
区块链技术在供应链金融中的创新实践
290 0
|
存储 API 数据库
探索后端开发之道:从基础到架构
在数字化浪潮不断推进的今天,后端开发作为支撑整个互联网应用的根基,扮演着至关重要的角色。本文将通过深入浅出的方式,介绍后端开发的核心概念、关键技术以及构建高效后端系统的实践方法。我们将一起探讨如何从零开始,逐步建立起一个稳定、可扩展的后端服务架构,并分析现代后端开发中面临的挑战与机遇。
283 2