LeetCode每日一题:778. 水位上升的泳池中游泳 C++ bfs 优先队列

本文介绍了一种使用手写优先队列和自定义排序函数的C++解决方案,用于解决图的最短路径问题。通过BFS算法结合优先队列,确保每次取出的节点具有最小权重,从而高效地找到从起点到终点的最短路径。
分析

采用优先队列对整个路径的寻找进行处理,
优先队列采用手写队列,每次bfs完后对于新的队列进行排序,之后每次取出的队头元素的权值一定是最小的。

C++ 代码
class Solution {
public:
    int n,m,hh=0,tt=-1,ans=-1;
    int dx[4]={0,1,0,-1};
    int dy[4]={1,0,-1,0};
    struct node{
        int x,y,w;

        bool operator<(const node& p)   //排序函数,按权值
        {
            return w<p.w;
        } 
    }q[55*55];
    int bfs(vector<vector<int>>& grid)
    {
        bool st[n+1][m+1];
        memset(st,0,sizeof st);
        node t;
        t.x=0,t.y=0,t.w=grid[0][0];
        q[++tt]=t;
        st[0][0]=true;
        while(hh<=tt)
        {
            t=q[hh++];      //取出队头元素,此时该元素权值最小
            ans=max(ans,t.w);
            node cur;
            for(int i=0;i<4;i++)
            {
                cur.x=t.x+dx[i];
                cur.y=t.y+dy[i];
                if(cur.x==n-1 && cur.y==m-1)    //搜到了终点
                {
                    cur.w=grid[cur.x][cur.y];
                    q[++tt]=cur;
                    ans=max(ans,cur.w);         //答案更新为二者的最大值
                    return 0;
                }
                if(cur.x>=0 && cur.x<n && cur.y>=0 && cur.y<m && !st[cur.x][cur.y])
                {
                    cur.w=grid[cur.x][cur.y];
                    st[cur.x][cur.y]=true;
                    q[++tt]=cur;        //该点加入到队列中
                }
            }
            sort(q+hh,q+tt+1);      //对队列进行排序
        }
        return 0;
    }
    int swimInWater(vector<vector<int>>& grid) {
        if(grid.size()<1) return 0;
        n=grid.size(),m=grid[0].size();
        bfs(grid);
        return ans;
    }
};
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jay_fearless

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值