給你乙個 m * n 的網格,其中每個單元格不是 0(空)就是 1(障礙物)。每一步,您都可以在空白單元格中上、下、左、右移動。
如果您 最多 可以消除 k 個障礙物,請找出從左上角 (0, 0) 到右下角 (m-1, n-1) 的最短路徑,並返回通過該路徑所需的步數。如果找不到這樣的路徑,則返回 -1。
dp陣列儲存的不一定是最優值
import j**a.util.arrays;
class solution , , , };
private int dp;
private int grid;
private boolean visited;
private int solve(int x, int y, int k)
if (x == grid.length - 1 && y == grid[0].length - 1)
if (grid[x][y] == 1)
int ans = integer.max_value;
for (int i = 0; i < directions.length; ++i)
}dp[x][y][k] = ans == integer.max_value ? ans : ans + 1;
}return dp[x][y][k];
}public int shortestpath(int grid, int k)
this.grid = grid;
this.visited = new boolean[grid.length][grid[0].length];
this.dp = new int[grid.length][grid[0].length][k + 1];
for (int i = 0; i < grid.length; ++i)
}visited[0][0] = true;
int ans = solve(0, 0, k);
return ans == integer.max_value ? -1 : ans;
}}
import j**a.util.arrays;
import j**a.util.linkedlist;
import j**a.util.queue;
class solution , , , };
public int shortestpath(int grid, int k)
int m = grid.length, n = grid[0].length;
if (m == 1 && n == 1)
k = math.min(m + n - 3, k);
boolean visited = new boolean[m][n][k + 1];
visited[0][0][k] = true;
queuequeue = new linkedlist<>();
queue.offer(new info(0, 0, 0, k));
while (!queue.isempty())
for (int i = 0; i < directions.length; ++i)
} else }}
}}
return -1;
}public static void main(string args) };
int k = 2;
system.out.println(new solution().shortestpath(grid, k));
}}class info
}
1293 網格中的最短路徑
題目 1293.網格中的最短路徑鏈結 思路 這題我們可以採用bfs和dfs來做,首先我們需要明白bfs由於相當於沒有回溯的過程,因此bfs是不需要遍歷完所有節點就可以找到到目的的最短路徑,但是由於dfs有借助於回溯的思想,因此是需要遍歷完所有節點才可以知道最短路徑長度。方法一bfs 思路 首先,我們...
leetCode 1293 網格中的最短路徑
定義乙個陣列記錄已經走過的網格 k math.min k,m n 3 boolean visited newboolean m n k 1 使用佇列儲存當前能走的網格座標的狀態 queue queue newlinkedlist queue.offer new nagoto 0 0,k int st...
GIS中的最短路徑
前段時間,在mapx上用vb實現了最短路徑的演算法。具體思路是,先在mapx上建立拓樸關係,將拓樸儲存到資料庫中,在分析路徑的時候從資料庫中載入拓樸關係,然後運用dijkstra演算法找出最短路徑。這裡面可能有兩個難點 1 如何快速建立拓樸關係。這裡面又可細分為如何組織拓樸結構 如何建立拓樸關係。2...