JavaInterview JavaInterview
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)

『Java面试+Java学习』
首页
指南
分类
标签
归档
  • CSDN (opens new window)
  • 文档集合 (opens new window)
  • 系统架构 (opens new window)
  • 微信号 (opens new window)
  • 公众号 (opens new window)
  • 指南
  • 简历

  • Java

  • 面试

  • 算法

  • algorithm
  • leetcode
JavaInterview.cn
2022-09-19
目录

为高尔夫比赛砍树Java

文章发布较早,内容可能过时,阅读注意甄别。

# 题目

你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中:

  • 0 表示障碍,无法触碰
  • 1 表示地面,可以行走
  • 比 1 大的数 表示有树的单元格,可以行走,数值表示树的高度

每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。

你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。

你将从 (0, 0) 点开始工作,返回你砍完所有树需要走的最小步数。 如果你无法砍完所有的树,返回 -1 。

可以保证的是,没有两棵树的高度是相同的,并且你至少需要砍倒一棵树。

示例 1:

输入:forest = [[1,2,3],[0,0,4],[7,6,5]]
输出:6
解释:沿着上面的路径,你可以用 6 步,按从最矮到最高的顺序砍掉这些树。

示例 2:

输入:forest = [[1,2,3],[0,0,0],[7,6,5]]
输出:-1
解释:由于中间一行被障碍阻塞,无法访问最下面一行中的树。

示例 3:

输入:forest = [[2,3,4],[0,0,5],[8,7,6]]
输出:6
解释:可以按与示例 1 相同的路径来砍掉所有的树。
(0,0) 位置的树,可以直接砍去,不用算步数。

提示:

  • m == forest.length
  • n == forest[i].length
  • 1 <= m, n <= 50
  • 0 <= forest[i][j] <= 109

# 思路

创建Node节点类

// 先把题读懂:砍树要按从矮到高的顺序,路过某棵树不一定非要砍

// 排序+暴力BFS:

# 解法


import java.util.*;
// 先把题读懂:砍树要按从矮到高的顺序,路过某棵树不一定非要砍

// 排序+暴力BFS:

class Solution {
    int move[][]={{-1,0},{1,0},{0,1},{0,-1}};
    public int cutOffTree(List<List<Integer>> forest) {
        List<int[]> list=new ArrayList<>();
        list.add(new int[]{0,0,forest.get(0).get(0)});
        for(int i=0;i<forest.size();i++){
            for(int j=0;j<forest.get(i).size();j++){
                int a=forest.get(i).get(j);
                if(a>1){list.add(new int[]{i,j,a});}
            }
        }
        Collections.sort(list,(a,b)->a[2]-b[2]);
        int ans=minSteps(new int[]{0,0},list.get(0),forest);
        if(ans==-1){return -1;}
        for(int i=1;i<list.size();i++){
            int d=minSteps(list.get(i-1),list.get(i),forest);
            if(d==-1){return -1;}
            ans+=d;
        }
        return ans;
    }
    public int minSteps(int a[],int b[],List<List<Integer>> forest){
        //BFS计算从a到b点需要的最短路程,假如无法到达,则返回-1;
        if(a[0]==b[0]&&a[1]==b[1]){return 0;}
        Queue<int[]> q=new LinkedList<>();
        boolean cameBefore[][]=new boolean[55][55];
        q.add(a);
        cameBefore[a[0]][a[1]]=true;
        int ans=0;
        while(q.size()>0){
            ans++;
            int size=q.size();
            for(int i=0;i<size;i++){
                int p[]=q.poll();
                for(int j=0;j<4;j++){
                    int x=p[0]+move[j][0],y=p[1]+move[j][1];
                    if(x>=0&&x<forest.size()&&y>=0&&y<forest.get(0).size()&&forest.get(x).get(y)!=0&&!cameBefore[x][y]){
                        if(x==b[0]&&y==b[1]){return ans;}
                        q.add(new int[]{x,y});
                        cameBefore[x][y]=true;
                    }
                }
            }
        }
        return -1;
    }

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

# 总结

  • 分析出几种情况,然后分别对各个情况实现
微信 支付宝
最近更新
01
1686. 石子游戏VI Java
08-18
02
1688. 比赛中的配对次数 Java
08-18
03
1687. 从仓库到码头运输箱子 Java
08-18
更多文章>
Theme by Vdoing | Copyright © 2019-2025 JavaInterview.cn
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式