簡體   English   中英

使用遞歸查找數組中的最短路徑

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM