题目:

You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-negative 2D map, in this map:

  1. 0 represents the obstacle can't be reached.
  2. 1 represents the ground can be walked through.
  3. The place with number bigger than 1 represents a tree can be walked through, and this positive number represents the tree's height.

You are asked to cut off all the trees in this forest in the order of tree's height - always cut off the tree with lowest height first. And after cutting, the original place has the tree will become a grass (value 1).

You will start from the point (0, 0) and you should output the minimum steps you need to walk to cut off all the trees. If you can't cut off all the trees, output -1 in that situation.

You are guaranteed that no two trees have the same height and there is at least one tree needs to be cut off.

Example 1:

Input:
[
[1,2,3],
[0,0,4],
[7,6,5]
]
Output: 6

Example 2:

Input:
[
[1,2,3],
[0,0,0],
[7,6,5]
]
Output: -1

Example 3:

Input:
[
[2,3,4],
[0,0,5],
[8,7,6]
]
Output: 6
Explanation: You started from the point (0,0) and you can cut off the tree in (0,0) directly without walking.

Hint: size of the given matrix will not exceed 50x50.

分析:

给定一个二维数组,其中的数字0表示障碍,1表示平地,大于等于2的数字表示树的高度,现在要求按照树高度由小到大进行砍伐,求最小步数。

先遍历二维数组,将树的高度保存起来并排序,同时记录相应的坐标。

从(0, 0)开始对树依次访问,查找是否有路径到达树,在这里使用BFS进行搜索,如果存在树无法进行访问,意味着我们无法砍伐掉所有的树,返回-1,当遍历完所有的树后,返回统计的步数即可。

程序:

C++

class Solution {
public:
int cutOffTree(vector<vector<int>>& forest) {
m = forest.size();
n = forest[0].size();
vector<tuple<int, int, int>> trees;
for(int i = 0; i < m; i++)
for(int j = 0; j < n; ++j)
if(forest[i][j] > 1)
trees.emplace_back(forest[i][j], i, j);
sort(trees.begin(), trees.end());
int fx = 0;
int fy = 0;
int res = 0;
for(int i = 0; i < trees.size(); i++){
int sx = get<1>(trees[i]);
int sy = get<2>(trees[i]); int steps = BFS(forest, fx, fy, sx, sy);
if(steps == -1)
return -1;
res += steps;
fx = sx;
fy = sy;
}
return res;
} private:
int BFS(vector<vector<int>>& forest, int fx, int fy, int sx, int sy){
vector<vector<int>> visited(m, vector<int>(n, 0));
queue<pair<int, int>> q;
static int mov[4][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}};
q.emplace(fx, fy);
int steps = 0;
while(!q.empty()){
int num = q.size();
while(num--){
auto node = q.front();
q.pop();
int cx = node.first;
int cy = node.second;
if (cx == sx && cy == sy)
return steps;
for (int i = 0; i < 4; ++i) {
int x = cx + mov[i][0];
int y = cy + mov[i][1];
if (x < 0 || x >= m || y < 0 || y >= n || !forest[x][y]|| visited[x][y])
continue;
visited[x][y] = 1;
q.emplace(x, y);
}
}
steps++;
}
return -1; }
int m;
int n;
};

Java

class Solution {
public int cutOffTree(List<List<Integer>> forest) {
m = forest.size();
n = forest.get(0).size();
ArrayList<Integer> list = new ArrayList<>();
HashMap<Integer, Pair<Integer, Integer>> map = new HashMap<>();
for(int i = 0; i < m; ++i){
for(int j = 0; j < n; ++j){
int height = forest.get(i).get(j);
if(height > 1){
list.add(height);
map.put(height, new Pair<>(i, j));
}
}
}
Collections.sort(list);
int fx = 0;
int fy = 0;
int res = 0;
for(Integer i:list){
int sx = map.get(i).getKey();
int sy = map.get(i).getValue();
int steps = BFS(forest, fx, fy, sx, sy);
if(steps == -1)
return -1;
res += steps;
fx = sx;
fy = sy;
}
return res;
}
private int BFS(List<List<Integer>> forest, int fx, int fy, int sx, int sy){
int[][] mov = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}};
int[][] visited = new int[m][n];
ArrayDeque<Pair<Integer, Integer>> arrayDeque = new ArrayDeque<>();
arrayDeque.add(new Pair<>(fx, fy));
int steps = 0;
while(!arrayDeque.isEmpty()){
int num = arrayDeque.size();
while(num-- > 0){
Pair<Integer, Integer> p = arrayDeque.pollFirst();
int cx = p.getKey();
int cy = p.getValue();
if(cx == sx && cy == sy)
return steps;
for (int i = 0; i < 4; ++i) {
int x = cx + mov[i][0];
int y = cy + mov[i][1];
if (x < 0 || x >= m || y < 0 || y >= n || forest.get(x).get(y) == 0 || visited[x][y] == 1)
continue;
visited[x][y] = 1;
arrayDeque.addLast(new Pair<>(x, y));
}
}
steps++;
}
return -1;
}
private int m;
private int n;
}

LeetCode 675. Cut Off Trees for Golf Event 为高尔夫比赛砍树 (C++/Java)的更多相关文章

  1. [LeetCode] 675. Cut Off Trees for Golf Event 为高尔夫赛事砍树

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  2. [LeetCode] Cut Off Trees for Golf Event 为高尔夫赛事砍树

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  3. LeetCode 675. Cut Off Trees for Golf Event

    原题链接在这里:https://leetcode.com/problems/cut-off-trees-for-golf-event/description/ 题目: You are asked to ...

  4. [LeetCode] 675. Cut Off Trees for Golf Event_Hard tag: BFS

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  5. 675. Cut Off Trees for Golf Event

    // Potential improvements: // 1. we can use vector<int> { h, x, y } to replace Element, sortin ...

  6. LeetCode - Cut Off Trees for Golf Event

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  7. [Swift]LeetCode675. 为高尔夫比赛砍树 | Cut Off Trees for Golf Event

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

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

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

  9. LeetCode:Unique Binary Search Trees I II

    LeetCode:Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees ...

  10. [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析

    本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...

随机推荐

  1. 【笔记】go语言--切片的操作

    go语言--切片的操作 接上篇切片的概念开始 //Slice添加元素 arr := [...]int{0,1,2,3,4,5,6,7} s1 := arr[2:6] s2 := s1[3:5]//[5 ...

  2. 力扣142(Java)-环形链表Ⅱ(中等)

    题目: 给定一个链表的头节点  head ,返回链表开始入环的第一个节点. 如果链表无环,则返回 null. 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环. 为了表示 ...

  3. 力扣619(MySQL)-只出现一次的最大数字(简单)

    题目: MyNumbers 表: 单一数字 是在 MyNumbers 表中只出现一次的数字. 请你编写一个 SQL 查询来报告最大的 单一数字 .如果不存在 单一数字 ,查询需报告 null . 查询 ...

  4. Lindorm-Operator云原生实践

    简介: Kubernetes 的CRD 机制(CustomResourceDefinition)支持通过自定义的controller来管理资源的生命周期,这样就可以像操作pod,deployment一 ...

  5. 终于要跟大家见面了,Flink 面试指南

    面试,一个令人大多数同学头疼的问题,要么成功进入心仪公司,要么沮丧与其失之交臂.但是,如果能在面试前就能知道面试官将会问的问题,然后可以好好提前准备,这种感觉是不是特别棒? 之前社区帮大家汇总了目前 ...

  6. Java应用结构规范

    ​简介:在Java程序开发中,命名和应用分层无疑是广大后端同胞的两大"痛点",本文提供一种基于领域模型的轻量级应用分层结构设计,供大家参考.下面按分层结构.分层明细.调用关系.各层 ...

  7. 数字农业WMS库存操作重构及思考

    ​简介: 数字农业库存管理系统在2020年时,部门对产地仓生鲜水果生产加工数字化的背景下应运而生.项目一期的数农WMS中的各类库存操作均为单独编写.而伴随着后续的不断迭代,这些库存操作间慢慢积累了大量 ...

  8. KubeVela 上手(1)|让云端应用交付更加丝滑

    简介: KubeVela 是阿里云和微软共同发起的 OAM(Open Application Model)标准的技术实现,旨在打造统一.标准.跨环境的云端应用交付,省时省力,轻松简单 作者|KubeV ...

  9. [FAQ] VisualStudio, Source file requires different compiler version (current compiler is 0.6.1+cxxxxxx)

    当使用的 Solidity 库文件中 pragma 指定的 版本 与本地编译器的使用版本不一致时,会出现这类提示. 解决方式是菜单栏 View -> Extensions -> Exten ...

  10. Codeforces Round 940 (Div. 2) and CodeCraft-23 (A-E)

    A. Stickogon 题意:给定 \(n\) 根木棒长度,问最多构成几个多边形. 贪心,四边形不会优于三角形. submission B. A BIT of a Construction 题意:构 ...