[英]java-recursively finding a specific path in array
我想知道我可以計算給定數組中的2條特定路徑。
如何返回從[0] [0]到[m] [n]的最短(或最長)路徑? 我設法遞歸地遍歷數組,但我不知道如何“保存”路徑並檢查返回的路徑是否較小。
第二個請求是一個問題,我已經困擾了很長時間,但是我看到了其他有關使用和計算帶有這些數組中的值的東西的問題。
由於您的描述性不是很高,所以我將盡我所能解釋基本概念。
1)檢查當前坐標是否達到目標,返回當前總和。 這是基本情況。
2)檢查當前執行的步驟是否超過了防止無限重復所需的最大步驟數。 這是失敗情況,在使用廣度優先搜索時必不可少。
3)檢查您要走到的下一個期望位置是否在網格內,並且之前沒有被訪問過。 將其標記為已訪問,然后保存該路徑中的總和。 當您返回時,將該位置標記為未訪問,然后嘗試下一個可用的舉動...以此類推,以獲取所有可能的方向。
4)在嘗試了所有可能的路徑后,比較它們的結果以查看哪一條是最小的,然后將其返回作為解決方案。
使用深度優先遞歸的示例:
public void solve(int[][] a, boolean[][] visited, int sum, int steps, int x, int y, int xMax, int yMax) {
if (isSolved(x, y)) { // Base case - solved
return sum;
}
if (steps > MAX_STEPS) {
return Integer.MAX_VALUE; // Return invalid if the algorithm exceeds maximum steps to prevent unlimited seek time
}
int[] path = new int[NUM_PATHS]; // An array holding the calculated paths for all possible options. Should
for (int i = 0; i < NUM_PATHS; i++) {
path[i] = Integer.MAX_VALUE; // Should be set to fail case as default.
}
if (canReach(x + 1, y) && !visited[y][x +1]) {
visited[y][x + 1] = true;
path[0] = solve(a, visited, sum + a[y][x + 1] steps + 1, x + 1, y, xMax, yMax);
visited[y][x + 1] false;
}
if (canReach(x - 1, y) && !visited[y][x - 1]) {
...
}
... etc
// Finding the best solution
min = path[0];
for (int i = 1; i < path.length; i++) {
if (path[i] < min)
min = path[i];
}
return min;
}
使用動態編程,您可以優化算法,以忽略比先前發現的最佳路徑差的路徑,從而縮短所需的遞歸。
另外,如果要保存所采用的路徑,請通過ArrayList進行操作,並像標記節點為已訪問時一樣添加/刪除它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.