[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-negative 2D map, in this map:
0
represents theobstacle
can't be reached.1
represents theground
can be walked through.The place with number bigger than 1
represents atree
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.
为一个高尔夫赛事砍掉森林中所有高度大于1的树,要按从低到高的顺序砍。森林用一个2D的map来表示,0代表障碍物,无法通过。1代表地面,可以通过。其他整数代表是树和相应的高度,可以通过。
解法:把是树的节点,按树高从低到高排序。然后从第一棵树开始,每次都用BFS求出和下一棵树之间的最短路径,然后累计路径和为结果。如果不能走到下一棵树,则返回-1。
Python:
class Solution(object):
def cutOffTree(self, forest):
"""
:type forest: List[List[int]]
:rtype: int
"""
def dot(p1, p2):
return p1[0]*p2[0]+p1[1]*p2[1] def minStep(p1, p2):
min_steps = abs(p1[0]-p2[0])+abs(p1[1]-p2[1])
closer, detour = [p1], []
lookup = set()
while True:
if not closer: # cannot find a path in the closer expansions
if not detour: # no other possible path
return -1
# try other possible paths in detour expansions with extra 2-step cost
min_steps += 2
closer, detour = detour, closer
i, j = closer.pop()
if (i, j) == p2:
return min_steps
if (i, j) not in lookup:
lookup.add((i, j))
for I, J in (i+1, j), (i-1, j), (i, j+1), (i, j-1):
if 0 <= I < m and 0 <= J < n and forest[I][J] and (I, J) not in lookup:
is_closer = dot((I-i, J-j), (p2[0]-i, p2[1]-j)) > 0
(closer if is_closer else detour).append((I, J))
return min_steps m, n = len(forest), len(forest[0])
min_heap = []
for i in xrange(m):
for j in xrange(n):
if forest[i][j] > 1:
heapq.heappush(min_heap, (forest[i][j], (i, j))) start = (0, 0)
result = 0
while min_heap:
tree = heapq.heappop(min_heap)
step = minStep(start, tree[1])
if step < 0:
return -1
result += step
start = tree[1]
return result
C++:
class Solution {
public:
int cutOffTree(vector<vector<int>>& forest) {
int m = forest.size(), n = forest[0].size(), res = 0, row = 0, col = 0;
vector<vector<int>> trees;
for (int i = 0; i < m; ++i) {
for (int j = 0; j < n; ++j) {
if (forest[i][j] > 1) trees.push_back({forest[i][j], i, j});
}
}
sort(trees.begin(), trees.end());
for (int i = 0; i < trees.size(); ++i) {
int cnt = helper(forest, row, col, trees[i][1], trees[i][2]);
if (cnt == -1) return -1;
res += cnt;
row = trees[i][1];
col = trees[i][2];
}
return res;
}
int helper(vector<vector<int>>& forest, int row, int col, int treeRow, int treeCol) {
if (row == treeRow && col == treeCol) return 0;
int m = forest.size(), n = forest[0].size(), cnt = 0;
queue<pair<int, int>> q{{{row, col}}};
vector<vector<bool>> visited(m, vector<bool>(n, false));
vector<vector<int>> dirs{{-1,0},{0,1},{1,0},{0,-1}};
while (!q.empty()) {
++cnt;
for (int i = q.size() - 1; i >= 0; --i) {
auto t = q.front(); q.pop();
for (auto dir : dirs) {
int x = t.first + dir[0], y = t.second + dir[1];
if (x < 0 || x >= m || y < 0 || y >= n || visited[x][y] || forest[x][y] == 0) continue;
if (x == treeRow && y == treeCol) return cnt;
visited[x][y] = true;
q.push({x, y});
}
}
}
return -1;
}
};
All LeetCode Questions List 题目汇总
[LeetCode] 675. Cut Off Trees for Golf Event 为高尔夫赛事砍树的更多相关文章
- [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 ...
- LeetCode 675. Cut Off Trees for Golf Event
原题链接在这里:https://leetcode.com/problems/cut-off-trees-for-golf-event/description/ 题目: You are asked to ...
- [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 ...
- 675. Cut Off Trees for Golf Event
// Potential improvements: // 1. we can use vector<int> { h, x, y } to replace Element, sortin ...
- 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 ...
- [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 ...
- Leetcode 675.为高尔夫比赛砍树
为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高 ...
- LeetCode:Unique Binary Search Trees I II
LeetCode:Unique Binary Search Trees Given n, how many structurally unique BST's (binary search trees ...
- [LeetCode系列]卡特兰数(Catalan Number) 在求解独特二叉搜寻树(Unique Binary Search Tree)中的应用分析
本文原题: LeetCode. 给定 n, 求解独特二叉搜寻树 (binary search trees) 的个数. 什么是二叉搜寻树? 二叉查找树(Binary Search Tree),或者是一棵 ...
随机推荐
- 微信小程序~下拉刷新PullDownRefresh
一.onPullDownRefresh回调 代码: // http://itlao5.com onPullDownRefresh: function () { console.log('onPul ...
- Centos7-Gnome安装
查看grouplist yum grouplist 安装gnome yum groupinstall "GNOME Desktop" root用户权限下,设置centos系统默认的 ...
- wordpress非管理员看不到数据需有manage_options权限
今天ytkah在调试一个新功能的时候发现wordpress非管理员看不到一些插件的数据,比如editor,添加一些用户权限还是不行,不得已直接把administrator所有的权限都添加测试一遍,最后 ...
- 如何使用powerdesigner导出sql脚本
使用power designer可以很方便的对数据库设计进行管理,并且能够更方便的查看表与表之间的关系.同时,还可以对设计好的数据库直接导出创建脚本,根据不同的数据库实例导出对应的创建脚本,然后根据脚 ...
- GlusterFS Dispersed Volume(纠错卷)总结
https://blog.csdn.net/daydayup_gzm/article/details/52748812 一.概念 Dispersed Volume是基于ErasureCodes(纠错码 ...
- vue echarts 给双饼图添加点击事件
在用 echarts 画旭双饼图( https://www.echartsjs.com/examples/zh/editor.html?c=pie-nest )的时候,经常会伴随着点击事件 如果想要在 ...
- CDH CM版本 6.0.1 升级到 CM 6.2.0 当前最新版本(CentOS 7.x)
CDH 的 6.0.1 是一个尴尬的版本,那时候 cloudera 还没有将 spark 更新到 2.4 还使用的是 spark 2.2版本. 但后来我们发现 2.3 | 2.4 更新了非常多的 fe ...
- vuex如何实现数据持久化,刷新页面存储的值还存在
1.安装: npm install vuex-persistedstate --save 2.找到store/index.js import Vue from 'vue' import Vuex fr ...
- @submit.native.prevent作用
<el-form :inline="true" :model="geCarManageData" class="demo-form-inline ...
- clion下批量删除断点