Skip to content

Commit 2f3d9af

Browse files
committed
add 1219. 黄金矿工
1 parent 35adcbe commit 2f3d9af

File tree

1 file changed

+119
-0
lines changed

1 file changed

+119
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4uanNkZWxpdnIubmV0L2doL2Nob2NvbGF0ZTE5OTkvY2RuL2ltZy8yMDIwMDgyODE0NTUyMS5qcGc?x-oss-process=image/format,png)
2+
>仰望星空的人,不应该被嘲笑
3+
4+
## 题目描述
5+
6+
你要开发一座金矿,地质勘测学家已经探明了这座金矿中的资源分布,并用大小为 `m * n` 的网格 `grid` 进行了标注。每个单元格中的整数就表示这一单元格中的黄金数量;如果该单元格是空的,那么就是 `0`
7+
8+
为了使收益最大化,矿工需要按以下规则来开采黄金:
9+
10+
每当矿工进入一个单元,就会收集该单元格中的所有黄金。
11+
矿工每次可以从当前位置向上下左右四个方向走。
12+
每个单元格只能被开采(进入)一次。
13+
不得开采(进入)黄金数目为 `0` 的单元格。
14+
矿工可以从网格中 任意一个 有黄金的单元格出发或者是停止。
15+
16+
示例 1:
17+
18+
```javascript
19+
输入:grid = [[0,6,0],[5,8,7],[0,9,0]]
20+
输出:24
21+
解释:
22+
[[0,6,0],
23+
[5,8,7],
24+
[0,9,0]]
25+
一种收集最多黄金的路线是:9 -> 8 -> 7
26+
```
27+
28+
示例 2:
29+
30+
```javascript
31+
输入:grid = [[1,0,7],[2,0,6],[3,4,5],[0,3,0],[9,0,20]]
32+
输出:28
33+
解释:
34+
[[1,0,7],
35+
[2,0,6],
36+
[3,4,5],
37+
[0,3,0],
38+
[9,0,20]]
39+
一种收集最多黄金的路线是:1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7
40+
```
41+
42+
43+
44+
提示:
45+
46+
```javascript
47+
1 <= grid.length, grid[i].length <= 15
48+
0 <= grid[i][j] <= 100
49+
最多 25 个单元格中有黄金。
50+
```
51+
52+
来源:力扣(LeetCode)
53+
链接:https://leetcode-cn.com/problems/path-with-maximum-gold
54+
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
55+
56+
57+
58+
## 解题思路
59+
60+
这题也是搜索相关,四个方向,不允许重复,不过这次我们需要从不同起点搜索,而且为了减少搜索次数,我们得从黄金数量不为0的点开始搜。然后每当走不下去的时候,就比较一下当前黄金数量,求出最大值即可。
61+
62+
```javascript
63+
/**
64+
* @param {number[][]} grid
65+
* @return {number}
66+
*/
67+
var getMaximumGold = function(grid) {
68+
if(!grid || !grid.length) return 0
69+
let vis = []
70+
// 最终收集的最多黄金数量
71+
let maxGold = 0
72+
for(let i=0;i<grid.length;i++) vis[i] = []
73+
// 剪枝条件
74+
let check = (x,y) => {
75+
if(x<0 || x>=grid.length || y<0 || y>=grid[0].length || vis[x][y] === 1 || !grid[x][y]) return false
76+
return true
77+
}
78+
let dfs = (x,y,total) => {
79+
if(check(x,y)){
80+
vis[x][y] = 1 //防止重复
81+
dfs(x+1,y,total+grid[x][y]) // 四个方向搜索
82+
dfs(x,y+1,total+grid[x][y])
83+
dfs(x-1,y,total+grid[x][y])
84+
dfs(x,y-1,total+grid[x][y])
85+
vis[x][y] = 0
86+
}else{
87+
// 走到底了,就比较一下当前黄金数量
88+
maxGold = Math.max(maxGold,total)
89+
}
90+
}
91+
// 起点从非0单元格开始
92+
for(let i=0;i<grid.length;i++){
93+
for(let j=0;j<grid[0].length;j++){
94+
if(grid[i][j]){
95+
dfs(i,j,0)
96+
}
97+
}
98+
}
99+
return maxGold
100+
};
101+
```
102+
103+
104+
## 最后
105+
文章产出不易,还望各位小伙伴们支持一波!
106+
107+
往期精选:
108+
109+
<a href="https://github.com/Chocolate1999/Front-end-learning-to-organize-notes">小狮子前端の笔记仓库</a>
110+
111+
<a href="https://yangchaoyi.vip/">访问超逸の博客</a>,方便小伙伴阅读玩耍~
112+
113+
![](https://img-blog.csdnimg.cn/2020090211491121.png#pic_center)
114+
115+
```javascript
116+
学如逆水行舟,不进则退
117+
```
118+
119+

0 commit comments

Comments
 (0)