题目链接:https://leetcode-cn.com/problems/minimum-path-sum/
struct node{//定义结构体节点
int x;//横坐标
int y;//纵坐标
int dis;//起点到该点的距离
int f;//启发式测度
node()
{
}
node(int _x,int _y,int _dis){//构造函数
x = _x;//给x赋值
y = _y;//给y赋值
dis = _dis;//给dis赋值
}
bool operator<(const node& a) const//重载运算符
{
return f > a.f; //小顶堆
}
};
class Solution {
private:
int computeF(vector<vector<int>>& grid,node node1)//计算启发式测度
{
int row = grid.size();//获取行数
int col = grid[0].size();//获取列数
int minV = 0;//最小值
if(node1.x+1<row)//可以往下走
{
minV = min(grid[node1.x+1][node1.y],minV);
}
if(node1.y+1<col)//可以往右走
{
minV = min(grid[node1.x][node1.y+1],minV);
}
return minV;//返回最小值
}
public:
int minPathSum(vector<vector<int>>& grid) {
int row = grid.size();//获取行数
int col = grid[0].size();//获取列数
vector<vector<int>> isVisited(row,vector<int>(col,0));//表示节点是否被访问过
priority_queue<node> q;//定义一个队列
node v0(0,0,grid[0][0]);//定义初始节点
q.push(v0);//将初始节点插入队列
node select;//选中节点
while(true)
{
select = q.top();//取队首元素
q.pop();//队首元素出队列
if(select.x==row-1&&select.y==col-1) break;//找到终点就结束
if(select.x+1<row&&!isVisited[select.x+1][select.y])//下面有点,且未被访问
{
isVisited[select.x+1][select.y] = 1;//访问过该节点了
node dow = node(select.x+1,select.y,select.dis+grid[select.x+1][select.y]);//定义一个节点,并进行初始化
dow.f = dow.dis+computeF(grid,dow);//计算启发式测度
q.push(dow);//往队列插入该节点
}
if(select.y+1<col&&!isVisited[select.x][select.y+1])//右边有点,且未被访问
{
isVisited[select.x][select.y+1] = 1;//标记访问过该节点
node rig = node(select.x,select.y+1,select.dis+grid[select.x][select.y+1]);//定义一个节点,并进行初始化
rig.f = rig.dis+computeF(grid,rig);//计算启发式测度
q.push(rig);//往队列插入该节点
}
}
return select.dis;//返回终点计算出的距离
}
};
最小路径和:A*搜索算法求解LeetCode网格问题

本文解析了如何使用A*搜索算法解决LeetCode上的最小路径和问题,通过定义结构体和启发式函数,实现从起点到终点的最短路径计算。
7万+

被折叠的 条评论
为什么被折叠?



