# 0675. Cut Off Trees for Golf Event
###### tags: `Leetcode` `BFS` `Hard`
Link: https://leetcode.com/problems/cut-off-trees-for-golf-event/
## 思路 $O(M^2N^2)$ $O(MN)$
先给所有的tree按照height排序 然后依次用bfs找最短距离
## Code
```java=
class Solution {
public int cutOffTree(List<List<Integer>> forest) {
Queue<int[]> pq = new PriorityQueue<>((a,b)->(a[2]-b[2]));
for(int i=0; i<forest.size(); i++){
for(int j=0; j<forest.get(0).size(); j++){
if(forest.get(i).get(j)>1){
pq.add(new int[]{i, j, forest.get(i).get(j)});
}
}
}
int[] start = new int[]{0,0};
int steps = 0;
int size = pq.size();
for(int i=0; i<size; i++){
int[] tree = pq.poll();
int step = bfs(forest, start, tree);
if(step==-1) return -1;
steps += step;
start = tree;
}
return steps;
}
private int bfs(List<List<Integer>> forest, int[] start, int[] tree){
boolean[][] visited = new boolean[forest.size()][forest.get(0).size()];
int[][] dirs = new int[][]{{-1,0},{1,0},{0,1},{0,-1}};
Queue<int[]> q = new LinkedList<>();
q.add(start);
visited[start[0]][start[1]] = true;
int step = 0;
while(!q.isEmpty()){
int size = q.size();
for(int i=0; i<size; i++){
int[] curr = q.poll();
if(curr[0]==tree[0] && curr[1]==tree[1]) return step;
for(int[] dir:dirs){
int newx = curr[0]+dir[0];
int newy = curr[1]+dir[1];
if(newx>=0 && newx<forest.size() && newy>=0 && newy<forest.get(0).size() && forest.get(newx).get(newy)!=0 && !visited[newx][newy]){
visited[newx][newy] = true;
q.add(new int[]{newx, newy});
}
}
}
step++;
}
return -1;
}
}
```