这道题目最大的难点是理解题意。

文章目录

  • 题目理解

题目理解

输入:一个非负的二维数组
输出:一个最短距离
规则:数组中的元素如果是0,表示障碍,不能通过。如果是1,表示可以行走的地面。如果大于1表示树的高度,需要被砍了以后才能行走。
现在要求,每次都从(0,0)出发,按照树的高度从低到高砍树。把所有树都砍完的最短距离是多少。如果不能砍完所有的树,则返回-1。

[
[1,2,3],
[0,0,4],
[7,6,5]
]
以上面的数组为例。先对所有非0节点按照数值排序。这个例子中砍树的顺序应该是(0,0)->(0,1)->(0,2)->(1,2)->(2,2)->(2,1)->(2,0)。
那么先计算(0,0)到(0,0)的最短距离d1。
接着计算(0,0)到(0,1)的最短距离d2。
接着计算(0,1)到(0,2)的最短距离d3.

所有距离相加,就是最短距离。

计算两个点之间的最短距离,可以使用bfs。官方解答中还有a星算法。没想明白为什么那么做。
时间复杂度O((mnmn))。我们可能要计算mn个节点的最短路径,每个节点计算过程中又可能与m*n个节点有关系。

class Solution {private int[][] pos = new int[][]{{-1,0},{1,0},{0,-1},{0,1}};private int m;private int n;public int cutOffTree(List<List<Integer>> forest) {List<int[]> trees = new ArrayList<int[]>();m = forest.size();n = forest.get(0).size();for(int i=0;i<m;i++){for(int j=0;j<n;j++){if(forest.get(i).get(j)>1){trees.add(new int[]{i,j,forest.get(i).get(j)});}}}Collections.sort(trees, new Comparator<int[]>() {public int compare(int[] o1, int[] o2) {return o1[2] - o2[2];}});int ans = 0, sr = 0,sc = 0;for(int[] tree : trees){int d = bfs(forest,sr,sc,tree[0],tree[1]);if(d<0) return -1;ans += d;sr = tree[0];sc = tree[1];}return ans;}private int bfs(List<List<Integer>> forest,int sr,int sc,int tr,int tc){Queue<int[]> queue = new ArrayDeque<int[]>();queue.offer(new int[]{sr,sc});boolean[][] seen = new boolean[m][n];seen[sr][sc] = true;int step = 0;while(!queue.isEmpty()){int size = queue.size();for(int k=0;k<size;k++){int[] array = queue.poll();sr = array[0];sc = array[1];if(sr == tr && sc == tc) return step;for(int i=0;i<4;i++){int nr = sr + pos[i][0];int nc = sc + pos[i][1];                   if(nr>=0 && nr<m && nc>=0 && nc<n && seen[nr][nc]==false && forest.get(nr).get(nc)>0){queue.offer(new int[]{nr,nc});seen[nr][nc]=true;}}}step++;}return -1;}
}

总结:我第一个没有想到的地方是可以先对树的高度排序。第二个没有想到的是按照从低到高走,找到每一步的最短路径,和就是总体最短路径。第三个没有想到的是在bfs过程中,我想判断条件forest.get(nr).get(nc)应该大于forest.get(sr).get(sc),这是因为我审题不清楚造成的误解。题目要求按照从低到高砍树,在从(sr,sc)到(tr,tc)过程中,只要节点值不为0 都可以通过,并不是说值>(sr,sc)的节点就不能走。

675. Cut Off Trees for Golf Event相关推荐

  1. leetcode刷题规划

    LeetCode精华题目列表[刷题规划系列] – TuringPlanet 目录 算法题到底在考察什么? 题目列表 Array String Linked List Queue Stack Advan ...

  2. leetcode算法练习 JavaScript实现

    leetcode 表格内容由spider.js从leetcode-cn.com爬取. 已做题目答案也从leetcode-cn.com中爬取并生成文件. 解题进度:已解决 140/637 - 简单 94 ...

  3. leetcode 题解 (500-1000题,持续更新,part 2)

    part1(1-500), part3(1000-*) 502. IPO 题意:给定k,w,profits数组和capital数组.k表示最多可完成的任务数.w是初始资本.profits是各个任务的收 ...

  4. LeetCode All in One 题目讲解汇总(持续更新中...)

    原文地址:https://www.cnblogs.com/grandyang/p/4606334.html 终于将LeetCode的大部分题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开 ...

  5. CF#420 B. Okabe and Banana Trees 思维|暴力|几何

    Okabe needs bananas for one of his experiments for some strange reason. So he decides to go to the f ...

  6. 第三十八章 短语动词

    362 引言   A 在现代英语中,常常将介词或副词置于某一动词之后,以便能够表达多种不同的意思: give away送给某人 give up放弃,停止(一种习惯或某种努力) look after照顾 ...

  7. poj 1873 枚举+凸包

    题意:给出一些树的位置,价值,长度,现要求先砍一些树制成一定长度的篱笆将剩余的树围起来,求要砍树的最小总价值. 因为树的个数最多为15个很容易想到用二进制数表示树的状态进行遍历. #include&l ...

  8. 森林正版服务器,The Forest 专用服务器设置向导

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 The Forest 专用服务器设置向导 本帖内容翻译了由 Steam社区的SurvivalistGaming [C.M.] 和其他 3 人合作完成的帖子 ...

  9. Codeforces Round #420 (Div. 2)

    这一场PP说很简单,我就闲来无事敲一敲好了,反正也考完了(雾,不过只剩数据结构和c++ A. Okabe and Future Gadget Laboratory time limit per tes ...

最新文章

  1. HashMap的扩容机制---resize()
  2. 图像处理之log---log算子
  3. 自由源自于自律 及其他三则分享
  4. php如何接收前端返回的各种类型的数据
  5. linux 裸设备使用,linux裸设备使用
  6. 北大师兄告诉你,怎样顺利完成自己的博士生涯
  7. 计算机组成原理计算题题库,计算机组成原理习题库.doc
  8. Linux转到Server服务,Linux下安装telnet-server服务
  9. Eclipse下Java项目转web项目
  10. 第10组17通信三班228网络协议抓包分析
  11. 软件架构师的12项修炼
  12. win7快捷方式去箭头_学会WIN+R,你的桌面再不需要快捷方式!
  13. Excel如何快速筛选?
  14. Pi滤波中磁珠和电感的使用注意事项
  15. 云存储及其分布式文件系统
  16. 跟李沐学AI:实用机器学习 | 第一章
  17. UltraISO使用和U盘安装原版系统指南
  18. traceroute 安装及使用
  19. c++ 对象模型 7
  20. eclipse 配置字符集 字体大小 护眼

热门文章

  1. 2.3线性表的链式存储和运算—单链表应用举例
  2. 通过CMD命令行创建和使用Android 模拟器 AVD
  3. UNIX时间戳及日期的转换与计算
  4. JQ基础练习---图片划过变暗
  5. 解决VMware6.5 以上版本安装RHEL 5的自动安装的问题
  6. 导致Android手机崩溃的壁纸,使用错误的壁纸会使你的Android手机崩溃
  7. 该文件可能是只读的 或者您要访问的位置_喔噢小贴士:如何保护PPT不被更改,将其设为只读...
  8. 解决 org.apache.hadoop.io.nativeio.NativeIO$POSIX.stat异常
  9. 5 微信公众号开发 获取 access_token
  10. Spring Cloud 采用Consul做配置中心