1293 網格中的最短路徑

2022-09-14 14:27:10 字數 1833 閱讀 9540

給你乙個 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...