2304. 网格中的最小路径代价

文章介绍了如何使用动态规划算法求解在一个二维网格中,给定移动代价矩阵,找到从第一行到达最后一行各列的最小总代价的问题。Solution类中的minPathCost函数实现了这一过程。
  • dp[j] 保存从第一行移动到当前行的各列的最小代价和
  • dp[j] = 上一行每一列到达当前行 j 列的代价的最小值,需遍历 n (列数)次
  • dp[j] 随 j 遍历滚动,最后得到到达最后一行各列的最小代价,取最小即可
class Solution {
public:
    int minPathCost(vector<vector<int>>& grid, vector<vector<int>>& moveCost) {
        int m = grid.size(), n = grid[0].size();
        vector<int> dp = grid[0];
        for(int i = 1; i < m; i++)
        {
            vector<int> tmp(n);
            for(int j = 0; j < n; j++)
            {
                int sum = INT_MAX;
                for(int k = 0; k < n; k++)
                {
                    tmp[j] = min(sum, 
                    		dp[k] + // dp为上一行 k 列最小代价
                    		moveCost[grid[i-1][k]][j] + 
                    		grid[i][j]);
                    sum = tmp[j];
                }
            }
            dp = tmp;
        }
        return *min_element(dp.begin(), dp.end());
    }
};
在彩色网格中计算最短路径的问题,通常涉及将网格中的每个单元格赋予不同的颜色或属性,这些属性可能代表不同的地形、成本、障碍物等。为了找到从起点到终点的最短路径,可以采用多种算法,其中 A*(A-Star)算法和 Dijkstra 算法是较为常见且有效的选择。 ### 1. 使用 A* 算法处理彩色网格 A* 算法是一种启发式搜索算法,适用于具有不同权重的网格环境。它通过维护一个启发函数来估计从当前节点到目标节点的距离,从而提高搜索效率[^2]。在彩色网格中,每种颜色可以映射为不同的移动代价: - 白色:无障碍,代价为 1; - 黑色:障碍物,不可通行; - 绿色:低代价区域,代价为 0.5; - 蓝色:高代价区域,代价为 2; 这种映射方式允许 A* 算法根据颜色调整路径选择策略,从而找到最优路径。 #### 实现步骤: - 将网格表示为二维数组,每个元素存储其颜色/代价; - 定义启发函数 $ h(n) $,如曼哈顿距离; - 维护两个集合:开放列表(Open List)与关闭列表(Closed List); - 每次从开放列表中选取 $ f(n) = g(n) + h(n) $ 最小的节点进行扩展; - 若遇到障碍物(如黑色单元格),则跳过该节点; - 当到达目标节点时,回溯父节点构建路径。 ```python def heuristic(a, b): return abs(a[0] - b[0]) + abs(a[1] - b[1]) # 曼哈顿距离 def a_star(grid, start, goal): open_set = [(0, start)] came_from = {} g_score = {start: 0} f_score = {start: heuristic(start, goal)} while open_set: current = min(open_set)[1] if current == goal: return reconstruct_path(came_from, current) open_set.remove((f_score[current], current)) for neighbor in get_neighbors(grid, current): tentative_g_score = g_score[current] + grid[neighbor[0]][neighbor[1]] if tentative_g_score < g_score.get(neighbor, float('inf')): came_from[neighbor] = current g_score[neighbor] = tentative_g_score f_score[neighbor] = tentative_g_score + heuristic(neighbor, goal) if (f_score[neighbor], neighbor) not in open_set: open_set.append((f_score[neighbor], neighbor)) return None ``` ### 2. 使用 Dijkstra 算法处理彩色网格 Dijkstra 算法是 A* 的一种特殊情况(即当启发函数 $ h(n) = 0 $ 时)。它适用于所有边权非负的图结构,在彩色网格中也可用于计算最短路径[^4]。由于 Dijkstra 不使用启发函数,因此它会遍历所有可达节点,最终找到全局最短路径。 #### 实现步骤: - 初始化所有节点的距离为无穷大,起点距离为 0; - 使用优先队列维护待访问节点; - 每次取出距离最小的节点,更新其邻居的距离; - 若邻居的颜色代表不同的移动代价,则累加相应的值; - 直到队列为空或目标节点被访问为止。 ```python import heapq def dijkstra(grid, start, goal): rows, cols = len(grid), len(grid[0]) dist = {(i, j): float('inf') for i in range(rows) for j in range(cols)} dist[start] = 0 pq = [(0, start)] visited = set() while pq: current_dist, current = heapq.heappop(pq) if current in visited: continue visited.add(current) if current == goal: break for dx, dy in [(-1,0),(1,0),(0,-1),(0,1)]: nx, ny = current[0]+dx, current[1]+dy if 0<=nx<rows and 0<=ny<cols and grid[nx][ny] != 2: # 假设2是障碍物 new_dist = current_dist + grid[nx][ny] if new_dist < dist[(nx, ny)]: dist[(nx, ny)] = new_dist heapq.heappush(pq, (new_dist, (nx, ny))) return dist[goal] ``` ### 3. 其他优化方法 - **动态规划**:适用于静态网格,可预处理所有点对之间的最短路径。 - **双向 BFS/A***:同时从起点和终点出发,减少搜索空间。 - **基于图像处理的网格生成**:利用图像识别技术将实际地图转化为彩色网格,再进行路径规划[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值