A*算法例子+代码

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

 题目链接: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;//返回终点计算出的距离
    }
};

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值