Что я делаю неправильно? (Java.lang.ArrayIndexOutOfBoundsException)

Мой код должен найти четыре последовательных числа одного и того же значения, удовлетворяющие этим четырем сценариям: (исходный код прикреплен внизу)
fig.a (соответствует методу isConsecutiveFourinStacks)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 6 2 1 8 2 9
6 5 6 1 1 9 1
1 3 6 1 4 0 7
3 3 3 3 4 0 7

fig.b (соответствует методу isConsecutiveFourinColumns)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 5 2 1 8 2 9
6 5 6 1 1 9 1
1 5 6 1 4 0 7
3 5 3 3 4 0 7

fig.c (соответствует методу isConsecutiveFourinReverseDiagonal)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 6 2 1 6 2 9
6 5 6 6 1 9 1
1 3 6 1 4 0 7
3 6 3 3 4 0 7

fig.d (соответствует методу isConsecutiveFourinDiagonal)
0 1 0 3 1 6 1
0 1 6 8 6 0 1
9 6 2 1 8 2 9
6 9 6 1 1 9 1
1 3 9 1 4 0 7
3 3 3 9 4 0 7

Пока что я смог сделать как положено, кроме рис.с
Я знаю, что могу просто перевернуть массив, чтобы он вел себя как fig.d, и использовать существующий метод для fig.d, чтобы получить необходимый результат.
В данном конкретном случае я пытаюсь прочитать данные из массива снизу вверх и слева направо, что приведет к рисунку, подобному рис.
Но я продолжаю выходить из связанной ошибки (строка 128).

Целью решения этой проблемы является:
1. Понимать индексирование многомерных массивов. 2. Понять, как вложенные циклы взаимодействуют друг с другом.

Я всего лишь студент, изучающий бакалавры в области компьютерных наук, с предварительными знаниями в C и C++, но никогда не получал четкого понимания этих двух аспектов кодирования. Любые советы будут с благодарностью.

package patternRecognition;

import java.util.Scanner;

public class ConsecutiveFoursInMatrix 
{
    public static Scanner input = new Scanner(System.in);
    public static void main(String[] args) 
    {
        int rows,columns;

        System.out.println("Enter number of elements in a rows: ");
        rows = input.nextInt();
        System.out.println("Enter number of columns: ");
        columns = input.nextInt();

        int[][] matrix = new int[columns][rows];

        System.out.println("Start entering "+rows+" number of elements in "+columns+" stack(s): ");

        for(int i=0; i<=columns-1; i++)
        {
            for(int j=0; j<=rows-1; j++)
            {
                matrix[i][j]=input.nextInt();
            }
        }
        System.out.println("The matrix you entered: ");

        for(int i=0; i<=columns-1; i++)
        {
            for(int j=0; j<=rows-1; j++)
            {
                System.out.print(matrix[i][j]+" ");
            }
            System.out.println();
        }

        //if(isConsecutiveFourinStacks(matrix,rows,columns)||isConsecutiveFourinColumns(matrix,rows,columns)||isConsecutiveFourinDiagonal(matrix,rows,columns))
        if(isConsecutiveFourinReverseDiagonal(matrix,rows,columns))
        {
            System.out.println("Series has consecutive fours");
        }
        else System.out.println("Series does not have consecutive fours");  
    }
    public static boolean isConsecutiveFourinStacks(int[][] matrix, int rows, int columns)
    {
        int count = 0;
        int consecutives = 0;
        for(int i=0; i<=columns-1; i++)
        {
            for(int j=0; j<=rows-2; j++)//rows-2 to avoid array out of bound error
            {
                if(matrix[i][j]==matrix[i][j+1])
                {
                    count++;
                    if (count==3)
                    {
                        consecutives++;
                        count = 0;
                    }
                }
                else count = 0;
            }
        }
        if(consecutives>0) return true;
        else return false;
    }
    public static boolean isConsecutiveFourinColumns(int[][] matrix, int rows, int columns)
    {
        int count = 0;
        int consecutives = 0;
        for(int j=0; j<=rows-1; j++)
        {
            for(int i=0; i<=columns-2; i++)
            {
                if(matrix[i][j]==matrix[i+1][j])
                {
                    count++;
                    if(count==3)
                    {
                        consecutives++;
                        count = 0;
                    }
                }
                else count = 0;
            }
        }
        if (consecutives>0) return true;
        else return false;
    }
    public static boolean isConsecutiveFourinDiagonal(int[][] matrix, int rows, int columns)
    {
        int count = 0;
        int consecutives = 0;
        for(int column=0; columns-column>=4; column++)
        {
            for(int row=0; rows-row>=4; row++)
            {
                for(int i=column,j=row; columns-i>=2 && rows-j>=2; i++,j++)
                {
                    if(matrix[i][j]==matrix[i+1][j+1])
                    {
                        count++;
                        if(count==3)
                        {
                            consecutives++;
                            count=0;
                        }
                    }
                    else count=0;
                }
            }   
        }
        if (consecutives>0) return true;
        else return false;
    }
    public static boolean isConsecutiveFourinReverseDiagonal(int[][] matrix, int rows, int columns)
    {
        int count = 0;
        int consecutives = 0;
        for(int column=columns-1; column>=0; column--)
        {
            for(int row=0; row<=rows-1; row++)
            {       
                for(int i=column,j=row; columns-i>=2 && j<=rows-2; i--,j++)
                {
                    if(matrix[i][j]==matrix[i-1][j+1])
                    {
                        count++;
                        if(count==3)
                        {
                            consecutives++;
                            count=0;
                        }
                    }
                    else count=0;
                }
            }
        }
        if (consecutives>0) return true;
        else return false;
    }
}


  [1]: https://stackru.com/images/9f5b37f42a54cdc0b7cb380b33079c56a3331be3.png

1 ответ

В самом внутреннем цикле метода isConsecutiveFourinReverseDiagonal просто установите значение i больше 0, поместите i>0 проверьте шаг проверки самого внутреннего цикла:

for(int i=column,j=row; columns-i>=2 && j<=rows-2 && i>0; i--,j++){
     if(matrix[i][j]==matrix[i-1][j+1]){
        count++;
        if(count==3){
          consecutives++;
          count=0;
        }
     } 
     else count=0;
}
Другие вопросы по тегам