Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f858a45

Browse files
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

Lines changed: 137 additions & 0 deletions
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

Lines changed: 137 additions & 0 deletions
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
```
Lines changed: 60 additions & 0 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /