题解 | #牛群的最小体力消耗值#

牛群的最小体力消耗值

https://www.nowcoder.com/practice/1b93d097ff6c4828bfa74f3718681e35

类似Dijkstra算法,找出所有可行路径中代价最少的那一条,朝四个方向移动, 计算其代价,更新每个点的minCost, 并加在队列后面,依次进行,最后取出重点的minCost。

#include <queue>
#include <cstring> // for memset

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param heights int整型vector<vector<>>
     * @return int整型
     */
    static const int maxn = 1e2 + 5;

    struct node {
        int x;
        int y;
        int val;
    };

    struct cmp {
        bool operator()(node a, node b) {
            return a.val > b.val; // 优先队列按照 val 的升序排序
        }
    };

    int minimumEffortPath(vector<vector<int>>& heights) {
        int n = heights.size(); // 矩阵的行数
        int m = heights[0].size(); // 矩阵的列数
        int minCost[maxn][maxn];
        
        memset(minCost, 0x3f, sizeof(minCost)); // 初始化 minCost 数组为最大值

        int dx[] = {1, 0, -1, 0}; // 方向数组,分别表示下、右、上、左
        int dy[] = {0, 1, 0, -1};

        priority_queue<node, vector<node>, cmp> pq;
        pq.push({0, 0, 0}); // 起点位置入队,初始耗费值为 0

        while (!pq.empty()) {
            node t = pq.top();
            pq.pop();

            for (int i = 0; i < 4; i++) {
                int xx = t.x + dx[i];
                int yy = t.y + dy[i];

                if (xx >= 0 && xx < n && yy >= 0 && yy < m) { // 判断新位置是否在矩阵范围内
                    int update = max(t.val, abs(heights[xx][yy] - heights[t.x][t.y])); // 计算从当前位置到新位置的耗费值(取当前耗费值和高度差的最大值)
                    
                    if (update < minCost[xx][yy]) { // 如果新位置的耗费值更小,则更新最小耗费值,并将新位置加入优先队列
                        minCost[xx][yy] = update;
                        pq.push({xx, yy, minCost[xx][yy]});
                    }
                }
            }
        }

        return minCost[n - 1][m - 1]; // 返回终点的最小耗费值
    }
};

全部评论

相关推荐

点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务