在m * n矩阵中计算连接数

时间:2018-10-04 17:47:17

标签: java matrix

我正在尝试找到以下程序的预期输出。.但是我遇到了错误

  Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
  at programbasics.CountingConnections.count(CountingConnections.java:7)
  at programbasics.CountingConnections.main(CountingConnections.java:26)

我的问题是关于矩阵m * n 。矩阵中的元素填充有值1和0

1 表示正在建立连接, 0 表示未建立连接。

我们需要垂直,水平和对角线地连接可用的相邻位置,并计算已建立的不同的连接的数量

我的代码是

  package programbasics; 
  class CountingConnections
  {
    static int count(int a[][], int i, int j) {
    int rows = a.length;
    int cols = a[0].length;
    if(a[i][j] == 0)  return 0;
    if (i == rows - 1 && j == cols - 1)
        return a[i][j];
    else if (i == rows - 1)
        return a[i][j + 1];
    else if (j == cols - 1)
        return a[i + 1][j];
    else if (a[i][j] == 1)
        return count(a, i + 1, j) + count(a, i, j + 1);
    else
        return 0;
   }
  public static void main(String[]args)
   {
   int a[][] = {{1,0,0,1},
             {0,1,1,1},
             {1,0,0,1}};
      int i = 3;
      int j = 4;
      System.out.println(count(a, i, j));;
    }
 }

预期输出为 8 。像位置连接如下
1)(0,0)->(1,1)
2)(2,0)->(1,1)




8)(0,3)->(1,3)

无法获得预期的输出8


         public static int count(int[][] a) {
         int[][] paths = new int[a.length][a[0].length];
         if ((paths[0][0] = a[0][0]) == 0) {
         return 0;
          }
         for (int c = 1; c < a[0].length; c++) {
           paths[0][c] = a[0][c] * paths[0][c - 1];
           }
            for (int r = 1; r < a.length; r++) 
           { 
         paths[r][0] = a[r][0] * paths[r - 1][0];
           for (int c = 1; c < a[r].length; c++) 
             {
        paths[r][c] = a[r][c] * (paths[r - 1][c] + paths[r][c - 1]);
          }
        }
           return paths[a.length - 1][a[0].length - 1];
        }

3 个答案:

答案 0 :(得分:0)

您在代码中调用if(a[i][j] == 0),在其中您将3传递为i,将4传递为j。但是Array的索引为零,因此当您尝试调用a[3][4]时,您尝试的是

     0    1    2    3    4

0   {1,   0,   0,   1}

1   {0,   1,   1,   1}

2   {1,   0,   0,   1}

3                         X

4

X所在的索引。显然,这不是您的Array中的有效索引。

另外,您的方法在不同的地方调用a[i + 1][j]a[i][j + 1],这意味着在确保代码不受限制时必须考虑到这一点。

对于您的实际方法,您的逻辑似乎有点不对劲。 if(a[i][j] == 0) return 0;将返回0并停止递归并返回0,而无需检查是否还有连接。您的逻辑应该更像这样:

  1. 从0,1开始。
  2. 如果索引是1 向右看一个索引,向右向下看一个索引(对角线),向右向下看一个索引,向左向下看(第二对角线)。
    如果这些索引上的任何数字是1,那么就增加计数器。
  3. 继续遍历矩阵,但请记住,您要上下遍历检查一行,因此对于行和列,您都只会循环直到长度小于-1。另外,请确保您从索引a[i][1]开始,因为您需要检查a[a+1][j-1],如果是j == 0,则将尝试调用a[a+1][-1],这将导致另一个索引输出范围

答案 1 :(得分:0)

public static int count(int[][] a, int m, int n) {

    int count = 0;

    for (int i = 0; i < m; i++) {
        for (int j = 0; j < n; j++) {

            if (a[i][j] == 1) {
                if (i - 1 >= 0 && j - 1 >= 0 && a[i - 1][j - 1] == 1) {
                    count = count + 1;

                }
                if (i - 1 >= 0 && a[i - 1][j] == 1) {
                    count = count + 1;
                }
                if (i - 1 >= 0 && j + 1 < n && a[i - 1][j + 1] == 1) {
                    count = count + 1;
                }
                if (j + 1 < n && a[i][j + 1] == 1) {
                    count = count + 1;
                }
            }
        }
    }


    return count;
}

答案 2 :(得分:0)

private int countConnections(int[][] a, int rows, int columns) {
    //cartesian plane coordinates around a point
    final int[] x = {1, 1, 1, -1, -1, -1, 0, 0};
    final int[] y = {1, -1, 0, 1, -1, 0, 1, -1};
    int count = 0;
    boolean[][] visited = new boolean[rows][columns];
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < columns; j++) {
            for (int k = 0; k < 8; k++) {
                int l = i + x[k];
                int m = j + y[k];
                //check for connections only if the given cell has value 1
                if (a[i][j] == 1 && canVisit(l, m, rows, columns, visited) && a[l][m] == 1) {
                    count++;
                }

            }
            visited[i][j] = true;
        }
    }
    return count;
}

private boolean canVisit(int i, int j, int rows, int columns, boolean [][] visited) {
    return i < rows && j < columns && i >= 0 && j >= 0 && !visited[i][j];
}

检查单元格值为 1 的单元格周围的所有 8 个单元格,并在遍历时将其标记为已访问。