使用递归在Array中查找最短路径

时间:2014-03-17 09:37:02

标签: java arrays recursion

我正在研究这个计划。它找到了数组中目的地的短路径。例如,如果输入是这样的:

###########
#         #
#### ######
#    #    X
#    #    #
# ###### ##
#         #
###########

out put会看起来像这样

###########
#>>>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。有没有其他方法可以递归地找到最短路径。

1 个答案:

答案 0 :(得分:0)

这个伪代码告诉如何遍历,而不是找到最小距离。首先需要正确遍历 现在修改它以找到最小距离。

 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的原因,它仍然会导致你在测试用例中看到的相同路径上循环