题目:

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. Thinkphp5.x全漏洞复现分析

    基础知识 命名空间和子命名空间 我们可以把namespace理解为一个单独的空间,事实上它也就是一个空间而已,子命名空间那就是空间里再划分几个小空间,举个例子: <?php namespace ...

  2. leetcode插件问题

    1.使用一段时间后,提交答案一直返回undefind 原因为插件缓存token有效期已过,需要重新登录 2. 重新登录

  3. vscode下的超级慢的解决方法

    vscode下的超级慢的解决方法 从网上看到的方法,记录给自己看 vscode官网:https://code.visualstudio.com/Download 复制下载链接 链接如下: https: ...

  4. verilog中端口定义方式以及如何使用变量

    一.module端口定义方式 目前有两种方式能够对module端口进行定义, 第一种是我目前使用比较多的,把I/O说明写在端口声明语句里,方式A: 1 module block( 2 input a, ...

  5. SysAK 应用抖动诊断篇—— eBPF又立功了! | 龙蜥技术

    ​简介:且看 SysAK 是如何打造一款性能开销不大.安全可靠.且灵活的关中断检测工具. ​ 文 / 系统运维 SIG 编者按:还记得曾经风靡一时的狄仁杰探案系列之<他抖任他抖,IO诊断在我手& ...

  6. RDS PostgreSQL一键大版本升级技术解密

    ​简介: 内容简要: 一.PostgreSQL行业位置 二.PostgreSQL版本升级背景 三.PostgreSQL版本升级解密 四.PostgreSQL版本升级成果 一.PostgreSQL行业位 ...

  7. C# 采集知网

    采集知网 WebClient /// <summary> /// 支持 Session 和 Cookie 的 WebClient. /// </summary> public ...

  8. 电路笔记03—kcl、kvl,独立源,受控源

    电路笔记03-kcl.kvl,独立源,受控源 听起来简单,做起来需要思考.所以做作业,思考很有 必要.电路的功率守恒,4种受控源,用两类约束列方程.电路分析力最难的一部分,怎么把一个量用其它量表示,后 ...

  9. Oracle和达梦:根据外键名字查询表名

    根据外键名字查询表名 select * from user_cons_columns cl where cl.constraint_name = '外键名';

  10. ES Monitoring 整理笔记

    Monitoring是elastic stack的监控模块,监控信息存在es索引中,并且可以通过kibana进行可视化的展示.(收集监控数据的方式从6.5版本起由Collectors-Exporter ...