Leetcode675. 为高尔夫比赛砍树:优先队列+广度优先找最短路径

2024-02-05 12:40

本文主要是介绍Leetcode675. 为高尔夫比赛砍树:优先队列+广度优先找最短路径,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目连接

675. 为高尔夫比赛砍树

 题目描述

 

解题思路

当一个图给出来的时候,砍树路径就已经确定了,是根据树的高度进行排序的。那么每次的行走的起点和重点也就确定了,只需要计算从起点到重点的最小值即可。

第一步,遍历整个图,将所有有树的节点假如优先队列。

第二步,从(0,0)起点开始,逐步从优先队列中取点。

第三步,取出的两个点,通过广度优先算法,计算出长度,即可。

解题代码


import com.eclipsesource.json.JsonArray;import java.util.*;public class Solution675 {private List<List<Integer>> tr;private int x;private int y;public static List<List<Integer>> stringToInt2dList(String input) {JsonArray jsonArray = JsonArray.readFrom(input);if (jsonArray.size() == 0) {return new ArrayList<List<Integer>>();}List<List<Integer>> list = new ArrayList<>(jsonArray.size());for (int i = 0; i < jsonArray.size(); i++) {JsonArray cols = jsonArray.get(i).asArray();JsonArray jsonArray2 = JsonArray.readFrom(cols.toString());List<Integer> arr = new ArrayList<>(jsonArray2.size());for (int i1 = 0; i1 < jsonArray2.size(); i1++) {arr.add(jsonArray2.get(i1).asInt());}list.add(arr);}return list;}public static void main(String[] args) {List<List<Integer>> forest1 = stringToInt2dList("[[54581641,64080174,24346381,69107959]," +"[86374198,61363882,68783324,79706116]," +"[668150,92178815,89819108,94701471]," +"[83920491,22724204,46281641,47531096]," +"[89078499,18904913,25462145,60813308]]");List<List<Integer>> forest = stringToInt2dList("[[4,2,3]," +"[0,0,1]," +"[7,6,5]]");int ret = new Solution675().cutOffTree(forest);String out = String.valueOf(ret);System.out.print(out);}private int getMinLen(Pair pair1, Pair pair2) {boolean[][] view = new boolean[x][y];LinkedList<Pair> list = new LinkedList<>();list.add(pair1);int k = 0;while (!list.isEmpty()) {int i = 0;int l = list.size();while (i < l) {Pair p = list.pollFirst();i++;int x0 = p.xx;int y0 = p.yy;if (p.xx == pair2.xx && p.yy == pair2.yy) {return k;} else {if (x0 >= 0 && x0 < x && y0 >= 0 && y0 < y && !view[x0][y0] && tr.get(x0).get(y0) != 0) {Pair up = new Pair(x0 - 1, y0);Pair down = new Pair(x0 + 1, y0);Pair left = new Pair(x0, y0 - 1);Pair right = new Pair(x0, y0 + 1);list.addLast(up);list.addLast(down);list.addLast(left);list.addLast(right);view[x0][y0] = true;}}}k++;}return -1;}public int cutOffTree(List<List<Integer>> forest) {if (forest.get(0).get(0) == 0) {return -1;}this.tr = forest;int x = forest.size();int y = forest.get(0).size();this.x = x;this.y = y;PriorityQueue<Pair> queue = new PriorityQueue<>(new Comparator<Pair>() {@Overridepublic int compare(Pair o1, Pair o2) {return forest.get(o1.xx).get(o1.yy) - forest.get(o2.xx).get(o2.yy);}});for (int i = 0; i < x; i++) {for (int j = 0; j < y; j++) {if (forest.get(i).get(j) > 1) {queue.add(new Pair(i, j));}}}Pair start = new Pair(0, 0);int res = 0;while (!queue.isEmpty()) {Pair target = queue.poll();int dist = getMinLen(new Pair(start.xx, start.yy), new Pair(target.xx, target.yy));if (dist == -1) {return -1;}res += dist;System.out.println(start + "to" + target + dist);start = target;}return res;}
}class Pair {int xx;int yy;public Pair(int xx, int yy) {this.xx = xx;this.yy = yy;}@Overridepublic String toString() {return "Pair{" +"xx=" + xx +", yy=" + yy +'}';}
}

其中,json的解析依赖如下。

        <dependency><groupId>com.eclipsesource.minimal-json</groupId><artifactId>minimal-json</artifactId><version>0.9.5</version></dependency>

 解题结果

 

这篇关于Leetcode675. 为高尔夫比赛砍树:优先队列+广度优先找最短路径的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/680945

相关文章

hdu1180(广搜+优先队列)

此题要求最少到达目标点T的最短时间,所以我选择了广度优先搜索,并且要用到优先队列。 另外此题注意点较多,比如说可以在某个点停留,我wa了好多两次,就是因为忽略了这一点,然后参考了大神的思想,然后经过反复修改才AC的 这是我的代码 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<

hdu2544(单源最短路径)

模板题: //题意:求1到n的最短路径,模板题#include<iostream>#include<algorithm>#include<cstring>#include<stack>#include<queue>#include<set>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#i

poj 1734 (floyd求最小环并打印路径)

题意: 求图中的一个最小环,并打印路径。 解析: ans 保存最小环长度。 一直wa,最后终于找到原因,inf开太大爆掉了。。。 虽然0x3f3f3f3f用memset好用,但是还是有局限性。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#incl

poj 3190 优先队列+贪心

题意: 有n头牛,分别给他们挤奶的时间。 然后每头牛挤奶的时候都要在一个stall里面,并且每个stall每次只能占用一头牛。 问最少需要多少个stall,并输出每头牛所在的stall。 e.g 样例: INPUT: 51 102 43 65 84 7 OUTPUT: 412324 HINT: Explanation of the s

poj 2431 poj 3253 优先队列的运用

poj 2431: 题意: 一条路起点为0, 终点为l。 卡车初始时在0点,并且有p升油,假设油箱无限大。 给n个加油站,每个加油站距离终点 l 距离为 x[i],可以加的油量为fuel[i]。 问最少加几次油可以到达终点,若不能到达,输出-1。 解析: 《挑战程序设计竞赛》: “在卡车开往终点的途中,只有在加油站才可以加油。但是,如果认为“在到达加油站i时,就获得了一

poj3750约瑟夫环,循环队列

Description 有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。 Input 第一行输入小孩的人数N(N<=64) 接下来每行输入一个小孩的名字(人名不超过15个字符) 最后一行输入W,S (W < N),用

POJ2010 贪心优先队列

c头牛,需要选n头(奇数);学校总共有f的资金, 每头牛分数score和学费cost,问合法招生方案中,中间分数(即排名第(n+1)/2)最高的是多少。 n头牛按照先score后cost从小到大排序; 枚举中间score的牛,  预处理左边与右边的最小花费和。 预处理直接优先队列贪心 public class Main {public static voi

【408DS算法题】039进阶-判断图中路径是否存在

Index 题目分析实现总结 题目 对于给定的图G,设计函数实现判断G中是否含有从start结点到stop结点的路径。 分析实现 对于图的路径的存在性判断,有两种做法:(本文的实现均基于邻接矩阵存储方式的图) 1.图的BFS BFS的思路相对比较直观——从起始结点出发进行层次遍历,遍历过程中遇到结点i就表示存在路径start->i,故只需判断每个结点i是否就是stop

Android Environment 获取的路径问题

1. 以获取 /System 路径为例 /*** Return root of the "system" partition holding the core Android OS.* Always present and mounted read-only.*/public static @NonNull File getRootDirectory() {return DIR_ANDR

Java并发编程之——BlockingQueue(队列)

一、什么是BlockingQueue BlockingQueue即阻塞队列,从阻塞这个词可以看出,在某些情况下对阻塞队列的访问可能会造成阻塞。被阻塞的情况主要有如下两种: 1. 当队列满了的时候进行入队列操作2. 当队列空了的时候进行出队列操作123 因此,当一个线程试图对一个已经满了的队列进行入队列操作时,它将会被阻塞,除非有另一个线程做了出队列操作;同样,当一个线程试图对一个空