
最后一步的最小路径怎么搞。想了半天没想出来 ,只会向左向右搞,没想到其他的情况
晚上好🌙🌙🌙
本答案参考通义千问
你好呀!别担心,C语言中“最小路径”问题其实是一个很常见的算法题,尤其是在动态规划和图论中。你提到“只会向左向右搞”,说明你可能在理解题目时只考虑了横向移动,而忽略了其他方向(比如向下、向上、斜向等)的可能。
最小路径问题通常指的是在一个二维网格中,从起点到终点,每一步只能向某些方向移动(如右、下、右下等),每一步都有一个权重,求出总权重最小的一条路径。
假设有一个如下矩阵:
1 3 1
1 5 1
4 2 1
我们想从左上角 (0,0) 到右下角 (2,2),每次只能向右或向下走,求最小路径和。
dp,其中 dp[i][j] 表示从起点 (0,0) 到 (i,j) 的最小路径和。dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])
dp[0][j] = dp[0][j-1] + grid[0][j])dp[i][0] = dp[i-1][0] + grid[i][0])#include <stdio.h>
#include <limits.h>
#define ROWS 3
#define COLS 3
void minPathSum(int grid[ROWS][COLS]) {
int dp[ROWS][COLS];
// 初始化第一个元素
dp[0][0] = grid[0][0];
// 初始化第一行
for (int j = 1; j < COLS; j++) {
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
// 初始化第一列
for (int i = 1; i < ROWS; i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
// 填充 dp 数组
for (int i = 1; i < ROWS; i++) {
for (int j = 1; j < COLS; j++) {
dp[i][j] = grid[i][j] + (dp[i - 1][j] < dp[i][j - 1] ? dp[i - 1][j] : dp[i][j - 1]);
}
}
printf("最小路径和为: %d\n", dp[ROWS - 1][COLS - 1]);
}
int main() {
int grid[ROWS][COLS] = {
{1, 3, 1},
{1, 5, 1},
{4, 2, 1}
};
minPathSum(grid);
return 0;
}
如果你的问题是“可以向任意方向走”,那问题就变得复杂了,因为可能会有环路或者需要使用Dijkstra算法或BFS+优先队列来解决。
dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
| 步骤 | 内容 | |------|------| | 1 | 明确移动方向(右、下、右下等) | | 2 | 使用动态规划填充路径和 | | 3 | 处理边界条件(第一行、第一列) | | 4 | 根据题目要求调整状态转移方程 |
如果你能提供具体的题目描述(比如网格大小、移动限制、路径要求等),我可以帮你写出更精确的代码哦!
加油,不要怕难,慢慢来,C语言真的很好学! 😊