Подсчет соединений в матрице am * n - PullRequest
0 голосов
/ 04 октября 2018

Я пытаюсь найти ожидаемый результат для программы ниже. Но я получаю сообщение об ошибке

  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];
        }

1 Ответ

0 голосов
/ 04 октября 2018

Вы звоните 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], что приведет к выходу другого индекса за пределы
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...