[英]Finding shortest path in Array using Recursion
我正在研究這個程序。 它在數組中找到到達目標的短路徑。 例如,如果輸入是這樣的:
###########
# #
#### ######
# # X
# # #
# ###### ##
# #
###########
輸出將看起來像這樣
###########
#>>>V #
####V######
# V# >>X
#V<<<# ^ #
#V######^##
#>>>>>>>^ #
###########
用戶也可以選擇從哪個位置開始。 在這里,用戶從矩陣的(1,1)開始。 這是我的代碼:
public class Test3 {
static char a[][] =
{
{'#','#','#','#','#','#','#','#','#','#','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#','#','#','#',' ','#','#','#','#','#','#'},
{'#',' ',' ',' ',' ','#',' ',' ',' ',' ','X'},
{'#',' ',' ',' ',' ','#',' ',' ',' ',' ','#'},
{'#',' ','#','#','#','#','#','#',' ','#','#'},
{'#',' ',' ',' ',' ',' ',' ',' ',' ',' ','#'},
{'#','#','#','#','#','#','#','#','#','#','#'},
};
static boolean[][] visited = new boolean[a.length][a[0].length];
public static void main(String[] args) {
// fill visited array
visited = new boolean[a.length][a[0].length];
for (int i = 0; i < visited.length; i++) {
for (int j = 0; j < visited[0].length; j++) {
visited[i][j] = false;
}
}
recursion(1,1);
/** This code block prints the array **/
for(int i=0; i< a.length;i++){
for(int j=0;j<a[i].length;j++){
System.out.print(a[i][j]);
}
System.out.println();
}
/** End of Print **/
}
private static void recursion(int row, int col) {
if (!isInBound(row, col) || visited[row][col])
return;
visited[row][col] = true;
if (a[row][col] == 'X') {
return;
}else if (a[row][col]==' ') { // check blank before entering
if(a[row][col+1]=='X'){
a[row][col]='>';
}
else if (((a[row][col-1]=='>')|| (a[row][col+1]=='<'))&&(a[row+1][col]==' ')){ // move down
a[row][col]='V';
recursion(row+1,col);
}
else if((a[row+1][col]==' ')&&((a[row-1][col]=='V')||(a[row][col-1]==' '))){ // keep going down
a[row][col]='V';
recursion(row+1,col);
}
else if((a[row][col-1]==' ')&& (a[row+1][col]!=' ')&& (a[row][col+1]!=' ')){ // move left
a[row][col]='<';
recursion(row,col-1);
}
else if((a[row-1][col]==' ')&&(a[row][col-1]=='>')){ //move up
a[row][col]='^';
recursion(row-1,col);
}else if((a[row+1][col]=='^')&&(a[row-1][col]==' ')){
a[row][col]='^';
recursion(row-1,col);
}else if ((a[row][col+1]=='#')){
a[row][col]='.';
recursion(row,col-1);
}
else {
// Keep going forward //
a[row][col]='>';
recursion(row, col + 1);
}
}
}
private static boolean isInBound(int row, int col) {
boolean bol = false;
if (row < a.length && col < a[0].length && col >= 0 && row >= 0) {
bol = true;
}
return bol;
}
}
到目前為止,它適用於簡單的輸入(如(1,1)或(1,2)等)。當輸入很復雜時,如(3,1),會發生以下情況:
###########
# #
#### ######
#>V>V# X
# >^.# #
# ###### ##
# #
###########
它在同一地方走動。 除了要處理很多其他if語句之外,還有其他方法嗎? 我想將此用於更大的矩陣(如100x100)。 還有其他方法可以遞歸地找到最短路徑。
該偽代碼告訴您如何遍歷,而不是找到最小距離。 您首先需要正確遍歷。
現在修改它以找到最小距離。
solve ( i , j , ch)
{
if(! safe(i,j)) return false
mark visited[i][j] = ch
if(matrix[i][j] == 'X') return true
return ( solve(i-1 , j ,T) | solve(i , j-1 , L) |solve(i , j+1 , R) |solve(i+1 , j , B))
}
main()
{
// x,y is starting point
if(!solve(x,y)) print no path
else found a path
}
您需要探索所有4個方向,但是僅探索第一個可能的方向,這就是您使用如此多的if-else
,這仍然可能導致您在測試用例中看到的路徑相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.