int m,n;
public int cutOffTree(List<List<Integer>> forest) {
int m=forest.size();
int n=forest.get(0).size();
this.m=m;
this.n=n;
int[][] g=new int[m][n];
List<int[]> trees=new ArrayList<>();//存储树和位置
trees.add(new int[]{0,0,0});//加入起点
for(int i=0;i<m;i++){
for(int j=0;j<n;j++){
g[i][j]=forest.get(i).get(j);
if(g[i][j]>1) trees.add(new int[]{g[i][j],i,j});
}
}
trees.sort((o1,o2)->o1[0]-o2[0]);//排序
int ans=0;
for(int i=0;i<trees.size()-1;i++){
int step=bfs(g,trees.get(i),trees.get(i+1));//广度优先求出最短路径长度
if(step==-1) return -1;//无法到达
ans+=step;
}
return ans;
}
int[][] dirs={{0,1},{1,0},{0,-1},{-1,0}};
int bfs(int[][] g,int[] from,int[] to){
if(from[1]==to[1]&&from[2]==to[2]) return 0;
Deque<int[]> q=new ArrayDeque<>();
q.add(new int[]{from[1],from[2]});
boolean[][] mark=new boolean[m][n];
mark[from[1]][from[2]]=true;
int layer=1;//当前层
while (!q.isEmpty()){
int size=q.size();//当前层数量
for (int i = 0; i < size; i++) {
int[] cur=q.poll();//从先进入的开始遍历
//下一层入队
for (int[] dir : dirs) {
int nr=cur[0]+dir[0],nc=cur[1]+dir[1];
if(nr>=0&&nr<m&&nc>=0&&nc<n&&!mark[nr][nc]&&g[nr][nc]>0){
mark[nr][nc]=true;
if(mark[to[1]][to[2]]) return layer;
q.offer(new int[]{nr,nc});
}
}
}
layer++;
}
return -1;
}
2022.5.23-----leetcode.675
于 2022-05-25 09:32:27 首次发布