【剑斩OFFER】算法的暴力美学——力扣 675 题:为高尔夫比赛砍树

一、题目描述

二、算法原理

思路:BFS 算法

1)找到图中不是0,1值,用个二维数组来存储他们的下标

2)排序,根据下标对应的值的大小升序

3)升序:1 -> 2 -> 3......... 的本质就是 1 ---> 2 的最短路径,2------> 3 的最短路径等,所以剩下的

BFS 算法的老套路;

三、代码实现

cpp 复制代码
class Solution {
    int dx[4] = {0,0,-1,1};
    int dy[4] = {1,-1,0,0};
    typedef pair<int,int> PII;
    int wight;
    int hight;
public:
    int cutOffTree(vector<vector<int>>& ft) {
        wight = ft.size();
        hight = ft[0].size();
        vector<PII> index;//存储树的坐标
        for(int i = 0; i < wight; i++)
        {
            for(int j = 0; j < hight; j++)
            {
                if(ft[i][j] > 1) index.push_back({i,j});
            }
        }

        sort(index.begin(),index.end(),[&](PII x,PII y){//根据树的高度升序
            return ft[x.first][x.second] < ft[y.first][y.second];
        });

        int bx = 0,by = 0;//起始点值
        int total = 0;
        for(auto [ex,ey] : index)//终点值
        {
            int sep = BFS(ft,bx,by,ex,ey);//查找目的值的步数
            if(sep < 0) return -1;//找不到
            total += sep;
            bx = ex;//更新起点值
            by = ey;
        }
        return total;
    }

    int BFS(vector<vector<int>>& ft,int bx,int by,int ex,int ey)
    {
        //BFS 算法
        if(bx == ex & by == ey) return 0;//有可能遍历到起始值
        queue<PII> que;
        que.push({bx,by});//起点值
        int ret = 0;
        bool vis[51][51];//标记是否遍历过入 queue 的下标
        memset(vis,false,sizeof(vis));//清空
        vis[bx][by] = true;//起点值已经遍历过了
        while(que.size())
        {
            int size = que.size();
            ret++;
            while(size--)// 层数
            {
                auto [x,y] = que.front();
                que.pop();
                for(int i = 0; i < 4; i++)// 上下左右遍历
                {
                    int a = x + dx[i];
                    int b = y + dy[i];
                    if(a >= 0 && b >= 0 && a < wight && b < hight && ft[a][b] && vis[a][b] == false)
                    {
                        if(a == ex && b == ey)
                        {
                            return ret;// 找到目标值
                        }
                        que.push({a,b});//更新
                        vis[a][b] = true;
                    }
                }
            }
        }
        return -1;//找不到
    }
};
相关推荐
致Great32 分钟前
科研人的 AI,不该只回答问题:我用字节TraeWork 跑了一遍真实研究任务
算法
纵有疾風起34 分钟前
线性表的定义与基本操作 — 从逻辑结构到 ADT 接口
数据结构·算法·408·线性表·adt
wuyk5551 小时前
1.栈:后进先出的线性数据结构
c语言·数据结构·stm32·单片机
测试_AI_一辰1 小时前
AI Agent 评测最隐蔽的坑-记忆
人工智能·算法·ai·自动化·ai编程
lucas_AI1 小时前
给YOLO检测器插 LoRA,'插对地方'比'插什么'更要命
人工智能·算法
LuminousCPP2 小时前
数据结构-时间与复杂度|时间/空间复杂度 + 两道力扣练习 + 二分查找复盘
c语言·数据结构·经验分享·算法·leetcode
Nil2082 小时前
leetcode 三数之和
数据结构·算法·leetcode
小小龙学IT2 小时前
C++ std::vector 底层实现深度解析:内存布局、扩容策略、移动语义与迭代器失效
开发语言·c++·算法
eBest数字化转型方案3 小时前
从工程视角拆解冰柜资产管理:拍照识别 pipeline、纯净度算法与 IoT 选型踩坑
人工智能·物联网·算法
Interview Aid1123 小时前
Roblox OA 面经|小游戏+编程双修,Coding 两题满分通过
算法