给出一个m*n的矩阵,求左上角到右下角的距离的最小值。

问题描述
这是一个商汤科技笔试题的变形,大致是给出一个m*n的矩阵,矩阵里的数代表其他相邻格到此格的距离,且只能向右和向下走,求左上角到右下角的距离的最小值。
例:
0 1 9
3 5 2
6 8 7
这个例子的最短距离是0-1-5-2-7,结果是15。
这个真的是想了一天,然后同学说用树做,我试了一下递归,没想到好像结果是正确的,真是意外,代码不长但是理解起来有点点难度(毕竟自己不常用递归)

class Distance{
int[][] mynum;
int x,y;
public Distance(int[][] mynum,int x,int y){
	this.mynum = mynum;
	this.x = x;
	this.y = y;               //传入矩阵和矩阵大小的x,y值
}

public int Minnumber(int xx,int yy){
	
	int minright;           
	    //定义minright为当前格到右下角格的最短距离
	int minbottom;       
	  //定义minright为当前格到右下角格的最短距离
	if(xx == x-1&&yy == y-1)
		return mynum[x-1][y-1];
	//如果已经是右下角格,则返回该格的值	
	else if(xx == x-1)
		return Minnumber(xx,yy+1) + mynum[xx][yy];	
		//否则,如果是最底一排格,返回该格的值与下一格到右下角格最短值之和	 
	else if(yy==y-1)
		return Minnumber(xx+1,yy) + mynum[xx][y
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
假设迷宫的距离数值矩阵为maze,m行n列,机器人从左上角出发,到达右下角的最短距离和最短路径可以使用动态规划算法解决。 具体思路如下: 1. 初始化一个m行n列的二维数组dp,用来存储每个位置到达左上角的最短距离。 2. 初始化dp[0][0]为maze[0][0],因为机器人从左上角出发,所以到达左上角的最短距离就是左上角距离数值。 3. 对于第一行和第一列的位置,因为只能向右或向下移动,所以到达这些位置的最短距离就是前一个位置的最短距离加上当前位置的距离数值。 4. 对于其他位置,到达当前位置的最短距离就是从上面或左边的位置中选择一个最小值,再加上当前位置的距离数值。 5. 最后dp[m-1][n-1]就是机器人从左上角到达右下角的最短距离,可以使用回溯算法找出最短路径。 代码如下: ```c #include <stdio.h> #define MAX_M 100 #define MAX_N 100 int maze[MAX_M][MAX_N]; // 迷宫距离数值矩阵 int dp[MAX_M][MAX_N]; // 到达每个位置的最短距离 int min(int a, int b) { return a < b ? a : b; } int main() { int m, n; printf("请输入迷宫的行数和列数:"); scanf("%d %d", &m, &n); printf("请输入迷宫中每个格子的距离数值:\n"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { scanf("%d", &maze[i][j]); } } // 初始化dp数组 dp[0][0] = maze[0][0]; for (int i = 1; i < m; i++) { dp[i][0] = dp[i-1][0] + maze[i][0]; } for (int j = 1; j < n; j++) { dp[0][j] = dp[0][j-1] + maze[0][j]; } // 动态规划解最短距离 for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) { dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + maze[i][j]; } } printf("机器人从左上角到达右下角的最短距离为:%d\n", dp[m-1][n-1]); // 回溯算法解最短路径 int x = m - 1, y = n - 1; while (x != 0 || y != 0) { printf("(%d,%d) ", x, y); if (x == 0) { y--; } else if (y == 0) { x--; } else { if (dp[x-1][y] < dp[x][y-1]) { x--; } else { y--; } } } printf("(0,0)\n"); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值