675. 为高尔夫比赛砍树

  • 题目大意
  • 思路
    • 代码
  • 复杂度

原题链接: 675. 为高尔夫比赛砍树

题目大意

你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中:
0 表示障碍,无法触碰
1 表示地面,可以行走
1大的数 表示有树的单元格,可以行走,数值表示树的高度
每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。
你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。
你将从(0, 0)点开始工作,返回你砍完所有树需要走的最小步数。 如果你无法砍完所有的树,返回-1
可以保证的是,没有两棵树的高度是相同的,并且你至少需要砍倒一棵树。
示例:

输入:
[ [1,2,3],[0,0,4],[7,6,5]]
输出: 6
输入:
[ [1,2,3],[0,0,0],[7,6,5]]
输出: -1
输入:
[ [2,3,4],[0,0,5],[8,7,6]]
输出: 6
解释: (0,0) 位置的树,你可以直接砍去,不用算步数。

思路

只要是g[i][j]大于等于1即可走,不管是否已经砍过,因此可先对所有树的高度排序,然后依次计算距离,累加距离为答案。若中间存在某两棵树之间无法达到,则答案为-1。

  1. 开一个数组,从低到高排序树的高度 O(nmlog(nm))
  2. 遍历该数组,依次计算两棵树之间的最短距离 O(nm * nm)

代码

class Solution {public:struct Tree{int x, y, h;bool operator< (const Tree& t) const{return h < t.h;}};vector<vector<int>> g;int n, m;int bfs(Tree start, Tree end){// 没有两棵树的高度是相同,当起始点{0, 0}有树时返回0if(start.x == end.x && start.y == end.y) return 0; // 开始求最短路const int INF = 0x3f3f3f3f;vector<vector<int>> dist(n, vector(m, INF));dist[start.x][start.y] = 0;queue<Tree> q; // 队列用于存位置x,yq.push({start.x, start.y, start.h}); // q.push(start);int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};while(q.size()){auto t = q.front();q.pop();for(int i = 0; i < 4; i ++ ){int x = t.x + dx[i], y = t.y + dy[i];if(x >= 0 && x < n && y >= 0 && y < m && g[x][y]){if(dist[x][y] > dist[t.x][t.y] + 1){dist[x][y] = dist[t.x][t.y] + 1;if(x == end.x && y == end.y) return dist[x][y];q.push({x, y});}} }}return -1;}int cutOffTree(vector<vector<int>>& forest) {g = forest;n = g.size(), m = g[0].size();vector<Tree> trs;for(int i = 0; i < n; i ++ )for(int j = 0; j < m; j ++ ){if(g[i][j] > 1){trs.push_back({i, j, g[i][j]});}}sort(trs.begin(), trs.end());Tree last = {0, 0};int res = 0;for(auto& tr : trs){int t = bfs(last, tr);if(t == -1) return -1;res += t;last = tr;}return res;}
};

复杂度

时间复杂度:O(n2m2)O(n^2m^2)O(n2m2)
空间复杂度:O(nm)O(nm)O(nm)

【LeetCode】675. 为高尔夫比赛砍树相关推荐

  1. Leetcode 675. 为高尔夫比赛砍树 C++

    Leetcode 675. 为高尔夫比赛砍树 题目 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比 ...

  2. leetcode 675. 为高尔夫比赛砍树——(每日一难day29)

    675. 为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树.树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数 表示有树的单 ...

  3. golang力扣leetcode 675.为高尔夫比赛砍树

    675.为高尔夫比赛砍树 675.为高尔夫比赛砍树 题解 代码 675.为高尔夫比赛砍树 675.为高尔夫比赛砍树 题解 题目:给一个二维矩阵,0不能走,1是陆地,2+是树,1和1往上都能走,从0,0 ...

  4. LeetCode 675. 为高尔夫比赛砍树

    675. 为高尔夫比赛砍树 [BFS]其实这个就是把点按照从小到大的顺序排序,然后BFS算出相邻点的距离累加起来,需要注意要从(0,0)开始走,所以一开始就加入一个(0,0,1)这样即使开始的最小值在 ...

  5. Leetcode 675.为高尔夫比赛砍树

    为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高 ...

  6. 【宫水三叶的刷题日记】675. 为高尔夫比赛砍树(困难)

    题目描述 这是 LeetCode 上的 675. 为高尔夫比赛砍树 ,难度为 困难. Tag : 「图论 BFS」.「AStar 算法」.「启发式搜索」.「并查集」 你被请来给一个要举办高尔夫比赛的树 ...

  7. 675 为高尔夫比赛砍树(宽搜)

    1. 问题描述: 你被请来给一个要举办高尔夫比赛的树林砍树.树林由一个 m x n 的矩阵表示, 在这个矩阵中: 0 表示障碍,无法触碰 1 表示地面,可以行走 比 1 大的数表示有树的单元格,可以行 ...

  8. 675. 为高尔夫比赛砍树 bfs

    你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高度. 你被要求按照 ...

  9. LeetCode--[广度优先搜索]675. 为高尔夫比赛砍树

    你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高度. 你被要求按照 ...

最新文章

  1. aws java mysql_AWS Serverless部署java api(RDS for MySQL篇)
  2. asp.net的dropDownlist只显示第一个字
  3. Java多线程之单例模式在多线程环境下的安全问题
  4. SSO的几种跨域方案
  5. SQL查询语句-返回名称的分类
  6. 2022年低压电工题库及模拟考试
  7. android+京东分类菜单,Android仿京东商品分类
  8. 手机 html宽度超出屏幕,解决华为手机用rem单位,内容超出屏幕宽度问题
  9. python自动办公pdf_python自动化办公之 Python 解析 PDF
  10. python实现批量图片格式转换
  11. Chrome电脑免安装多个浏览器版本号共存
  12. Tomcat8.5后版本不返回200 OK的问题解决
  13. Java面向对象程序设计(四)-- 继承与多态
  14. media在HTML中作用,web前端:关于css中@media的一些基本使用
  15. 2022国庆头像制作iAPP安卓源码+附APP成品
  16. UE4学习之材质系统初探
  17. 阿里工程师谈,什么是好的代码?
  18. Java顶级大神的面试经验,竟如此超越常理
  19. MATLAB调用USB摄像头的过程记录
  20. 计算机智能方面相关论文,计算机人工智能论文.doc

热门文章

  1. 理解伪类选择器与伪元素选择器
  2. 利用python操作word文档
  3. 《地理信息系统导论》chapter 5 GIS数据获取 习作
  4. yolov7 网络架构深度解析
  5. Linux VI文本编辑器
  6. ubuntu21.04换源
  7. 服务监控之promethues+grafana,直接送你上大师,这还不上热门吗
  8. python 利用百度推广API接口,每日调整关键词价格,关键词点击率大于10%的进行降低价格和点击率小于4%进行增加价格
  9. Java项目版本构建是什么意思_Java项目的构建和版本号(ant,cvs,hudson)
  10. 【翻译】Rosetta Large Scale System for Text Detection and Recognition in Images