Skip to content

Commit f858a45

Browse files
committed
feat: add solutions to lc problem: No.0675
No.0675.Cut Off Trees for Golf Event
1 parent af5811e commit f858a45

File tree

4 files changed

+401
-0
lines changed

4 files changed

+401
-0
lines changed

solution/0600-0699/0675.Cut Off Trees for Golf Event/README.md

+137
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,143 @@ public:
254254
};
255255
```
256256
257+
### **Go**
258+
259+
```go
260+
var dirs = [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
261+
262+
type tree struct {
263+
height int
264+
pos int
265+
}
266+
267+
func cutOffTree(forest [][]int) int {
268+
row, col := len(forest), len(forest[0])
269+
270+
bfs := func(start, end int) int {
271+
q := []int{start}
272+
vis := make(map[int]bool)
273+
vis[start] = true
274+
step := 0
275+
for n := len(q); n > 0; n = len(q) {
276+
for i := 0; i < n; i++ {
277+
state := q[0]
278+
q = q[1:]
279+
if state == end {
280+
return step
281+
}
282+
for k := 0; k < 4; k++ {
283+
x, y := state/col+dirs[k][0], state%col+dirs[k][1]
284+
nxt := x*col + y
285+
if x >= 0 && x < row && y >= 0 && y < col && forest[x][y] != 0 && !vis[nxt] {
286+
q = append(q, nxt)
287+
vis[nxt] = true
288+
}
289+
}
290+
}
291+
step++
292+
}
293+
return -1
294+
}
295+
296+
var trees []tree
297+
for i := 0; i < row; i++ {
298+
for j := 0; j < col; j++ {
299+
if forest[i][j] > 1 {
300+
trees = append(trees, tree{forest[i][j], i*col + j})
301+
}
302+
}
303+
}
304+
sort.Slice(trees, func(i, j int) bool {
305+
return trees[i].height < trees[j].height
306+
})
307+
308+
ans, start := 0, 0
309+
for _, t := range trees {
310+
end := t.pos
311+
step := bfs(start, end)
312+
if step == -1 {
313+
return -1
314+
}
315+
ans += step
316+
start = end
317+
}
318+
return ans
319+
}
320+
```
321+
322+
### **Rust**
323+
324+
```rust
325+
use std::collections::HashSet;
326+
use std::collections::VecDeque;
327+
328+
const DIRS: [[i32; 2]; 4] = [[-1, 0], [1, 0], [0, -1], [0, 1]];
329+
330+
impl Solution {
331+
pub fn cut_off_tree(forest: Vec<Vec<i32>>) -> i32 {
332+
let (row, col) = (forest.len() as i32, forest[0].len() as i32);
333+
334+
let bfs = |start: i32, end: i32| -> i32 {
335+
let mut queue = VecDeque::new();
336+
let mut vis = HashSet::new();
337+
queue.push_back(start);
338+
vis.insert(start);
339+
let mut step = 0;
340+
while !queue.is_empty() {
341+
let n = queue.len();
342+
for _ in 0..n {
343+
let state = queue.pop_front().unwrap();
344+
if state == end {
345+
return step;
346+
}
347+
for k in 0..4 {
348+
let x = state / col + DIRS[k][0];
349+
let y = state % col + DIRS[k][1];
350+
let nxt = x * col + y;
351+
if x >= 0
352+
&& x < row
353+
&& y >= 0
354+
&& y < col
355+
&& forest[x as usize][y as usize] != 0
356+
&& !vis.contains(&nxt)
357+
{
358+
queue.push_back(nxt);
359+
vis.insert(nxt);
360+
}
361+
}
362+
}
363+
step += 1;
364+
}
365+
-1
366+
};
367+
368+
let mut trees = Vec::new();
369+
for i in 0..row {
370+
for j in 0..col {
371+
let height = forest[i as usize][j as usize];
372+
if height > 1 {
373+
trees.push((height, i * col + j));
374+
}
375+
}
376+
}
377+
trees.sort();
378+
379+
let (mut ans, mut start) = (0, 0);
380+
for t in &trees {
381+
let end = t.1;
382+
let step = bfs(start, end);
383+
if step == -1 {
384+
return -1;
385+
}
386+
ans += step;
387+
start = end;
388+
}
389+
ans
390+
}
391+
}
392+
```
393+
257394
### **...**
258395

259396
```

solution/0600-0699/0675.Cut Off Trees for Golf Event/README_EN.md

+137
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,143 @@ public:
233233
};
234234
```
235235
236+
### **Go**
237+
238+
```go
239+
var dirs = [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
240+
241+
type tree struct {
242+
height int
243+
pos int
244+
}
245+
246+
func cutOffTree(forest [][]int) int {
247+
row, col := len(forest), len(forest[0])
248+
249+
bfs := func(start, end int) int {
250+
q := []int{start}
251+
vis := make(map[int]bool)
252+
vis[start] = true
253+
step := 0
254+
for n := len(q); n > 0; n = len(q) {
255+
for i := 0; i < n; i++ {
256+
state := q[0]
257+
q = q[1:]
258+
if state == end {
259+
return step
260+
}
261+
for k := 0; k < 4; k++ {
262+
x, y := state/col+dirs[k][0], state%col+dirs[k][1]
263+
nxt := x*col + y
264+
if x >= 0 && x < row && y >= 0 && y < col && forest[x][y] != 0 && !vis[nxt] {
265+
q = append(q, nxt)
266+
vis[nxt] = true
267+
}
268+
}
269+
}
270+
step++
271+
}
272+
return -1
273+
}
274+
275+
var trees []tree
276+
for i := 0; i < row; i++ {
277+
for j := 0; j < col; j++ {
278+
if forest[i][j] > 1 {
279+
trees = append(trees, tree{forest[i][j], i*col + j})
280+
}
281+
}
282+
}
283+
sort.Slice(trees, func(i, j int) bool {
284+
return trees[i].height < trees[j].height
285+
})
286+
287+
ans, start := 0, 0
288+
for _, t := range trees {
289+
end := t.pos
290+
step := bfs(start, end)
291+
if step == -1 {
292+
return -1
293+
}
294+
ans += step
295+
start = end
296+
}
297+
return ans
298+
}
299+
```
300+
301+
### **Rust**
302+
303+
```rust
304+
use std::collections::HashSet;
305+
use std::collections::VecDeque;
306+
307+
const DIRS: [[i32; 2]; 4] = [[-1, 0], [1, 0], [0, -1], [0, 1]];
308+
309+
impl Solution {
310+
pub fn cut_off_tree(forest: Vec<Vec<i32>>) -> i32 {
311+
let (row, col) = (forest.len() as i32, forest[0].len() as i32);
312+
313+
let bfs = |start: i32, end: i32| -> i32 {
314+
let mut queue = VecDeque::new();
315+
let mut vis = HashSet::new();
316+
queue.push_back(start);
317+
vis.insert(start);
318+
let mut step = 0;
319+
while !queue.is_empty() {
320+
let n = queue.len();
321+
for _ in 0..n {
322+
let state = queue.pop_front().unwrap();
323+
if state == end {
324+
return step;
325+
}
326+
for k in 0..4 {
327+
let x = state / col + DIRS[k][0];
328+
let y = state % col + DIRS[k][1];
329+
let nxt = x * col + y;
330+
if x >= 0
331+
&& x < row
332+
&& y >= 0
333+
&& y < col
334+
&& forest[x as usize][y as usize] != 0
335+
&& !vis.contains(&nxt)
336+
{
337+
queue.push_back(nxt);
338+
vis.insert(nxt);
339+
}
340+
}
341+
}
342+
step += 1;
343+
}
344+
-1
345+
};
346+
347+
let mut trees = Vec::new();
348+
for i in 0..row {
349+
for j in 0..col {
350+
let height = forest[i as usize][j as usize];
351+
if height > 1 {
352+
trees.push((height, i * col + j));
353+
}
354+
}
355+
}
356+
trees.sort();
357+
358+
let (mut ans, mut start) = (0, 0);
359+
for t in &trees {
360+
let end = t.1;
361+
let step = bfs(start, end);
362+
if step == -1 {
363+
return -1;
364+
}
365+
ans += step;
366+
start = end;
367+
}
368+
ans
369+
}
370+
}
371+
```
372+
236373
### **...**
237374

238375
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
var dirs = [][]int{{-1, 0}, {1, 0}, {0, -1}, {0, 1}}
2+
3+
type tree struct {
4+
height int
5+
pos int
6+
}
7+
8+
func cutOffTree(forest [][]int) int {
9+
row, col := len(forest), len(forest[0])
10+
11+
bfs := func(start, end int) int {
12+
q := []int{start}
13+
vis := make(map[int]bool)
14+
vis[start] = true
15+
step := 0
16+
for n := len(q); n > 0; n = len(q) {
17+
for i := 0; i < n; i++ {
18+
state := q[0]
19+
q = q[1:]
20+
if state == end {
21+
return step
22+
}
23+
for k := 0; k < 4; k++ {
24+
x, y := state/col+dirs[k][0], state%col+dirs[k][1]
25+
nxt := x*col + y
26+
if x >= 0 && x < row && y >= 0 && y < col && forest[x][y] != 0 && !vis[nxt] {
27+
q = append(q, nxt)
28+
vis[nxt] = true
29+
}
30+
}
31+
}
32+
step++
33+
}
34+
return -1
35+
}
36+
37+
var trees []tree
38+
for i := 0; i < row; i++ {
39+
for j := 0; j < col; j++ {
40+
if forest[i][j] > 1 {
41+
trees = append(trees, tree{forest[i][j], i*col + j})
42+
}
43+
}
44+
}
45+
sort.Slice(trees, func(i, j int) bool {
46+
return trees[i].height < trees[j].height
47+
})
48+
49+
ans, start := 0, 0
50+
for _, t := range trees {
51+
end := t.pos
52+
step := bfs(start, end)
53+
if step == -1 {
54+
return -1
55+
}
56+
ans += step
57+
start = end
58+
}
59+
return ans
60+
}

0 commit comments

Comments
 (0)