import java.util.*;

class Solution {
public int cutOffTree(List<List<Integer>> forest) {
int m = forest.size();
int n = forest.get(0).size(); int[][][][] f = new int[m][n][m][n]; int max = m * n;
init(forest, m, n, f); // floyd(forest, n, f, max); List<int[]> list = new ArrayList<>();
list.add(new int[]{0,0,0});
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int val = forest.get(i).get(j);
if( val > 1){
list.add(new int[]{i,j,val});
}
}
}
Collections.sort(list, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[2] - o2[2];
}
}); int ans = 0;
for(int i=0;i<list.size()-1;i++){
int[] val = list.get(i);
int x = val[0];
int y = val[1];
int[] nextVal = list.get(i+1);
int tmp = dijkstra(forest,x,y,f,nextVal[0],nextVal[1]);
if(tmp == -1){
return -1;
}
ans += tmp;
} return ans;
} public int dijkstra(List<List<Integer>> forest,int x,int y ,int[][][][] f,int nextx,int nexty){
PriorityQueue<int[]> queue = new PriorityQueue<>(new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[2] - o2[2];
}
}); queue.offer(new int[]{x,y,0}); int m = forest.size();
int n = forest.get(0).size();
boolean[][] visited = new boolean[m][n];
visited[x][y] = true; while( !queue.isEmpty()) {
int[] node = queue.poll();
if( node[2] == Integer.MAX_VALUE){
continue;
}
if(node[0] == nextx &&node[1] == nexty){
return f[x][y][nextx][nexty];
}
int[][] dirs = new int[][]{
{0, 1}, {0, -1},
{-1, 0}, {1,0}
};
for (int i = 0; i < 4; i++) {
int newx = node[0] + dirs[i][0];
int newy = node[1] + dirs[i][1]; if (newx >= 0 && newx < m && newy >= 0 && newy < n && !visited[newx][newy] && forest.get(newx).get(newy)!=0) {
visited[newx][newy] = true;
int xk = node[0];
int yk = node[1];
f[x][y][newx][newy] = f[x][y][xk][yk]+1;
queue.add(new int[]{newx,newy,f[x][y][newx][newy]});
}
}
}
return -1;
} private void floyd(List<List<Integer>> forest, int n, int[][][][] f, int max) {
for (int k = 0; k < max; k++) {
int val = forest.get(k/ n).get(k% n);
if( val == 0){
continue;
}
for (int i = 0; i < max; i++) {
if (f[i / n][i % n][k / n][k % n] == Integer.MAX_VALUE) {
continue;
}
val = forest.get(i/ n).get(i% n);
if( val == 0){
continue;
}
for (int j = 0; j < max; j++) {
if (f[k / n][k % n][j / n][j % n] == Integer.MAX_VALUE) {
continue;
}
f[i / n][i % n][j / n][j % n] = Math.min(f[i / n][i % n][j / n][j % n], f[i / n][i % n][k / n][k % n] + f[k / n][k % n][j / n][j % n]);
}
}
}
} private void init(List<List<Integer>> forest, int m, int n, int[][][][] f) {
int[][] dirs = new int[][]{
{0, 1}, {0, -1},
{-1, 0}, {1,0}
};
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
for (int ii = 0; ii < m; ii++) {
for (int jj = 0; jj < n; jj++) {
f[i][j][ii][jj] = Integer.MAX_VALUE;
if (i == ii && jj == j) {
f[i][j][i][j] = 0;
}
}
} }
} for (int x = 0; x < m; x++) {
for (int y = 0; y < n; y++) {
for (int d = 0; d < 4; d++) {
int newx = x + dirs[d][0];
int newy = y + dirs[d][1]; if (newx >= 0 && newx < m && newy >= 0 && newy < n) {
int v1 = forest.get(x).get(y);
int v2 = forest.get(newx).get(newy); if (v1 == 0 || v2 == 0) {
f[x][y][newx][newy] = Integer.MAX_VALUE;
f[newx][newy][x][y] = Integer.MAX_VALUE;
} else {
f[x][y][newx][newy] = 1;
f[newx][newy][x][y] = 1;
}
}
}
}
}
} }

[675. 为高尔夫比赛砍树] dijkstra算法的更多相关文章

  1. Leetcode 675.为高尔夫比赛砍树

    为高尔夫比赛砍树 你被请来给一个要举办高尔夫比赛的树林砍树. 树林由一个非负的二维数组表示, 在这个数组中: 0 表示障碍,无法触碰到. 1 表示可以行走的地面. 比1大的数 表示一颗允许走过的树的高 ...

  2. [Swift]LeetCode675. 为高尔夫比赛砍树 | Cut Off Trees for Golf Event

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  3. [LeetCode] 675. Cut Off Trees for Golf Event 为高尔夫赛事砍树

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  4. [LeetCode] Cut Off Trees for Golf Event 为高尔夫赛事砍树

    You are asked to cut off trees in a forest for a golf event. The forest is represented as a non-nega ...

  5. 经典树与图论(最小生成树、哈夫曼树、最短路径问题---Dijkstra算法)

    参考网址: https://www.jianshu.com/p/cb5af6b5096d 算法导论--最小生成树 最小生成树:在连通网的所有生成树中,所有边的代价和最小的生成树,称为最小生成树. im ...

  6. Dijkstra算法优先队列实现与Bellman_Ford队列实现的理解

    /* Dijkstra算法用优先队列来实现,实现了每一条边最多遍历一次. 要知道,我们从队列头部找到的都是到 已经"建好树"的最短距离以及该节点编号, 并由该节点去更新 树根 到其 ...

  7. Dijkstra算法(二)之 C++详解

    本章是迪杰斯特拉算法的C++实现. 目录 1. 迪杰斯特拉算法介绍 2. 迪杰斯特拉算法图解 3. 迪杰斯特拉算法的代码说明 4. 迪杰斯特拉算法的源码 转载请注明出处:http://www.cnbl ...

  8. 【Python排序搜索基本算法】之Dijkstra算法

    Dijkstra算法和前一篇的Prim算法非常像,区别就在于Dijkstra算法向最短路径树(SPT)中添加顶点的时候,是按照ta与源点的距离顺序进行的.OSPF动态路由协议就是用的Dijkstra算 ...

  9. Cocos2d-x 地图步行实现1:图论Dijkstra算法

    下一节<Cocos2d-x 地图行走的实现2:SPFA算法>: http://blog.csdn.net/stevenkylelee/article/details/38440663 本文 ...

  10. 最短路径算法——Dijkstra算法

    在路由选择算法中都要用到求最短路径算法.最出名的求最短路径算法有两个,即Bellman-Ford算法和Dijkstra算法.这两种算法的思路不同,但得出的结果是相同的. 下面只介绍Dijkstra算法 ...

随机推荐

  1. 【奶奶看了也不会】AI绘画 Mac安装stable-diffusion-webui绘制AI妹子保姆级教程

    1.作品图 2.准备工作 目前网上能搜到的stable-diffusion-webui的安装教程都是Window和Mac M1芯片的,而对于因特尔芯片的文章少之又少,这就导致我们还在用老Intel 芯 ...

  2. 小知识:PDML的注意事项补充

    关于PDML,之前在 并行,想说爱你不容易中的第一节就介绍过,今天在客户现场协助测试时又遇到几个有关PDML的问题,都蛮典型的,记录一下: 问题1:某存储过程报错ORA-12839. 查看该错误号说明 ...

  3. ASP.NET Core分布式项目实战(Consent视图制作)--学习笔记

    任务19:Consent视图制作 按照上一节 Consent 的思路 在 mvcCookieAuthSample 项目的 Controllers 文件夹下新建一个 ConsentController ...

  4. CentOS7 卸载/home 扩大/root空间

    卸载home 备份home分区文件 # 新系统无视 tar cvf /tmp/home.tar /home 修改fstab(这一步非常重要,千万别漏了) 准备卸载/home文件系统,centos启动时 ...

  5. Power BI 15 DAY

    业务(表结构)数据分析 1.业务理解 准确 全面 2.数据收集 了解需要用到的数据有哪些 5W2H 结构化数据 SQL.通过查询获取数据库资源 多源表结构数据 企业数据库数据 文本文件数据 Excel ...

  6. NC24911 数独挑战

    题目链接 题目 题目描述 数独是一种填数字游戏,英文名叫 Sudoku,起源于瑞士,上世纪 70 年代由美国一家数学逻辑游戏杂志首先发表,名为 Number Place,后在日本流行,1984 年将 ...

  7. 延时队列 DelayQueue

    当用户超时未支付时,给用户发提醒消息.另一种场景是,超时未付款,订单自动取消.通常,订单创建的时候可以向延迟队列种插入一条消息,到时间自动执行.其实,也可以用临时表,把这些未支付的订单放到一个临时表中 ...

  8. linux如何发送电子邮件

      使用linux时,有时我们想发邮件给朋友或同事,可不可以通过命令行直接发呢?         想通过linux监控网站或者系统状况并自动报警,如何使用脚本发出邮件给外部邮箱呢?         不 ...

  9. mysql-5.7.16-winx64配置文件

    # For advice on how to change settings please see # http://dev.mysql.com/doc/refman/5.7/en/server-co ...

  10. windows 程序启动后挂到后台

    开发中遇到一个问题,程序启动后,并没有出现在前台,而是自动挂到后台,程序处于卡死状态,基本任何模块都没加载进来. 后面排查发现跟一个功能的第三方 dll 有关系,在那个 dll 加载时导致程序卡死,因 ...