【问题标题】:recursively finding an element in 2d matrix递归查找二维矩阵中的元素
【发布时间】:2014-04-22 01:53:48
【问题描述】:

我正在尝试在矩阵中递归查找一个数字。

public class Test2 {
static char arry [][] = {{'#','#','#'},
                         {'#',' ',' '},
                         {'#',' ','#'},
                         {'#',' ','1'},
};

public static void main(String args []){
    recursion(2,1);

}

private static void recursion(int row, int col) {
    if(arry[row][col]=='1' && isInBound(row,col)==true){
        System.out.println("Found at " + row + " " + col);
    }else if ((isInBound(row,col)==true)&& arry[row][col]==' '){
        recursion(row,col+1);
        recursion(row,col-1);
        recursion(row-1,col);
        recursion(row+1,col);

    }

}

private static boolean isInBound(int row, int col) {
    boolean bol = false;
    if(row<= arry.length && col <= arry[0].length){
        bol = true;
    }

    return bol;
}

}

我正在尝试以能够从任何位置开始的方式来制作程序。例如,我从这个程序中的 2,1 位置开始。我得到了一个越​​界异常。在使用 try catch 循环时,代码有时适用于某些输入。除非绝对必要,否则我不想使用 try catch。我也在尝试在矩阵中寻找所有 4 个方向。这就是我的问题开始的地方,我要越界了。

【问题讨论】:

  • 修复此错误后,您将需要以某种方式跟踪访问过的单元格,否则您的搜索将在两个单元格之间来回摆动,直到堆栈溢出。

标签: java arrays recursion matrix


【解决方案1】:

仅使用您目前所写的内容,您应该首先使用isInBound 检查您的索引是否有效,如果超出范围则立即使用return;。按照您当前检查边界的方式,您将始终在测试边界之前使用边界,这意味着无论您从哪里开始,您总是会遇到越界异常。

例如在private static void recursion(..)开头,添加以下内容:

if(!isInBound(row,col)) {
    return;
}

并且不需要后续的数组绑定测试。因此,您的递归调用对无效边界的任何递归调用都将简单地返回,而不会引发越界异常。

【讨论】:

    【解决方案2】:

    这行得通:

    public class Test2 {
        static char arry[][] = { { '#', '#', '#' }, { '#', ' ', ' ' },
                { '#', ' ', '#' }, { '#', ' ', '1' }, };
        static boolean[][] visited = new boolean[arry.length][arry[0].length];
    
        public static void main(String args[]) {
            // fill visited array
            for (int i = 0; i < visited.length; i++) {
                for (int j = 0; j < visited[0].length; j++) {
                    visited[i][j] = false;
                }
            }
    
            recursion(2, 1);
    
        }
    
        private static void recursion(int row, int col) {
            if (!isInBound(row, col) || visited[row][col])
                return;
            visited[row][col] = true;
    
            if (arry[row][col] == '1') {
                System.out.println("Found at " + row + " " + col);
                return;
            } else if (arry[row][col] == ' ') {
                recursion(row, col + 1);
                recursion(row - 1, col);
                recursion(row + 1, col);
                recursion(row, col - 1);
    
            }
    
        }
    
        private static boolean isInBound(int row, int col) {
            boolean bol = false;
            if (row < arry.length && col < arry[0].length && col >= 0 && row >= 0) {
                bol = true;
            }
    
            return bol;
        }
    }
    

    【讨论】:

      【解决方案3】:
      private static void recursion(int row, int col) {
          if(arry[row][col]=='1'){
              System.out.println("Found at " + row + " " + col);
          }
          else if (arry[row][col]=='#'){
              return;
          }
          if (isInBound(row,col + 1)){
              recursion(row,col+1);
          }
          if(isInBound(row, col - 1)){
              recursion(row, col - 1)
          }
          if(isInBound(row -1, col)){
              recursion(row-1,col);
          } 
          if(isInBound(row + 1, col) {
              recursion(row+1,col);
          }
          else {
              return;
          }
      }
      

      假设你在找到一个时跳过了#。

      【讨论】:

        猜你喜欢
        • 2012-09-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-26
        • 2019-11-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多