矩阵的最短路径问题
今天字节二面,面试官给了一个笔试题,因为时间仓促,也没有提前准备,就挂掉了,回来仔细思考了一下做了个简单的解答,
题目是这样的,一个mxn的二维矩阵,均为正元素,且对应的元素代表该处的代价,求从(0,0)到(m,n)的最短路径。
code如下:
#include <iostream>
#include <cstring>
#include <vector>
#include <queue>
using namespace std;
class Solution {
public:
typedef struct Index{
Index(){x = 0; y = 0;};
Index(int xx, int yy):x(xx),y(yy){}
int x, y;
};
std::vector<std::pair<int ,int>> shortestRoad(const vector<vector<int>> &matrix) {
std::vector<std::pair<int, int>> answer;
int m = matrix.size();
if(m == 0) return answer;
const int maxvale = 10000000;
int n = matrix[0].size();
vector<vector<int>> table = matrix;
for(size_t i = 0; i < table.size(); i++){
for(size_t j = 0; j < table[i].size(); j++){
table[i][j] = maxvale;
}
}
std::queue<Index> q;
Index target(m-1, n-1);
table[m-1][n-1] = std::min(maxvale, matrix[m-1][n-1]);
q.push(target);
while (!q.empty()){
Index top = q.front();
q.pop();
if(top.x == 0 && top.y == 0){
break;
}
if(top.x - 1 >= 0){
if(table[top.x-1][top.y] > table[top.x][top.y] + matrix[top.x-1][top.y]){
table[top.x - 1][top.y] = table[top.x][top.y] + matrix[top.x-1][top.y];
q.push(Index(top.x-1, top.y));
}
}
if(top.x + 1 < m){
if(table[top.x+1][top.y] > table[top.x][top.y] + matrix[top.x+1][top.y]){
table[top.x + 1][top.y] = table[top.x][top.y] + matrix[top.x+1][top.y];
q.push(Index(top.x+1, top.y));
}
}
if(top.y - 1 >= 0){
if(table[top.x][top.y-1] > table[top.x][top.y] + matrix[top.x][top.y-1