Почему это работает на бумаге, а лог c не работает в коде - PullRequest
0 голосов
/ 20 июня 2020

У меня есть код, который определяет, есть ли какие-либо 4 одинаковых последовательных числа (по вертикали или горизонтали), а затем распечатывает истину или ложь соответственно. Хотя я считаю, что сделал это правильно, это не работает. Странно то, что на бумаге это действительно работает! Код записан в java. Код:

    import java.util.Scanner;

public class Main
{
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int rows = input.nextInt();
        int columns = input.nextInt();
        int [][] integers = new int[rows][columns];
        for(int i = 0; i < rows; i++){
            for(int j = 0; j < columns; j++){
                integers[i][j] = input.nextInt();
            }
        }
        if(Sinexomena4(integers)){
            System.out.println("true");
        }else{
            System.out.println("false");
        }
        
    }
    
    public static Boolean Sinexomena4(int [][] values){
        //Horizontal
        for (int i = 0; i < values.length; i++){
            for(int j = 0; j <= values[0].length - 4; j++){
                if (values[j][i] == values[j + 1][i] &&
                    values[j + 1][i] == values[j + 2][i] && 
                    values[j + 2][i] == values[j + 3][i] ){
                    return true;
                }
            }
        }
        //Vertical
        for (int i = 0; i < values.length; i++){
            for(int j = 0; j <= values[0].length - 4; j++){
                if (values[i][j] == values[i][j + 1] &&
                    values[i][j + 1] == values[i][j + 2] &&
                    values[i][j + 2] == values[i][j + 3] ){
                    return true;
                }
            }
        }
        //Diagonal
        //Down
        for (int j = 0; j <= values.length - 4; j++){
            for(int i = 0; i <= values[0].length - 4;i++){
                if (values[i][j] == values[i + 1][j + 1] &&
                    values[i + 1][j + 1] == values[i + 2][j + 2] && 
                    values[i + 2][j + 2] == values[i + 3][j + 3]){
                    return true;
                }
            }
            
        }
        //Up
        for (int j = values.length; j > 2; j--){
            for(int i = 0; i <= values[0].length - 4;i++){
                if (values[j][i] == values[j - 1][i + 1] && 
                    values[j - 1][i + 1] == values[j - 2][i + 2] && 
                    values[j - 2][i + 2] == values[j - 3][i + 3]){
                    return true;
                }
            }
        }
        return false;
    }
}


this is the input
0 0 0 1
0 0 1 0
0 1 0 0
1 0 0 0

Изменить : Все работает отлично, кроме второй диагонали. Вторая диагональ отлично работает с матрицей 4x4, но при увеличении размера возникает ошибка

Кто-нибудь знает, почему это не работает? Я немного отладил его, но мне не повезло! (Также я новичок в переполнении стека go легко для меня :))

Ответы [ 2 ]

0 голосов
/ 21 июня 2020

У вашего кода в текущей версии все еще есть проблемы. Во-первых, для горизонтальной / вертикальной части вы все еще делаете 4 сравнения. Вы могли исправить это в своей локальной версии, но отредактированный код в исходном вопросе все еще имеет эту проблему.

Более фундаментальная проблема заключается в том, что вы смешиваете строки и столбцы. Вам следует последовательно использовать переменные i и j. Иногда вы используете i для строки, иногда для столбца. Посмотрите, как вы читаете ввод. Первое измерение вашей матрицы относится к строкам, второе - к столбцам. Учитывая комментарий в исходном коде, «горизонтальный» и «вертикальный» - это наоборот.

Если вы используете более сложные варианты использования, вы увидите, что вам не хватает вариантов. Например, следующая матрица не будет правильно обработана вашим кодом:

5 5
2 0 1 1 0
1 0 1 0 1
0 1 2 1 0
0 0 2 0 0
2 1 1 1 1

Ваши границы l oop также нуждаются в исправлении. Для быстрой проверки сделайте расчет (в уме) для пограничных случаев. В вашем случае «диагональ вверх» l oop заканчивается, когда j равно 4. Вы проверяете элемент с индексом [j-3][i+3], т.е. [1][i+3], но код никогда не встречает [0][i+3], поэтому вам не хватает первого столбца.

Вот исправленная и более согласованная версия вашего кода . Я включил несколько операторов println(), чтобы на самом деле было видно, где находится последовательность чисел.

public static Boolean Sinexomena4(int [][] values){
    // Horizontal
    for (int i = 0; i < values.length; i++){
        for(int j = 0; j <= values[0].length - 4; j++){
            if (values[i][j] == values[i][j+1] &&
                    values[i][j+1] == values[i][j+2] &&
                    values[i][j+2] == values[i][j+3]){
                System.out.println("horizontal "+i+" "+j);
                return true;
            }
        }
    }

    // Vertical
    for (int i = 0; i <= values.length-4; i++){
        for(int j = 0; j < values[0].length; j++){
            if (values[i][j] == values[i+1][j] &&
                    values[i+1][j] == values[i+2][j] &&
                    values[i+2][j] == values[i+3][j]){
                System.out.println("vertical "+i+" "+j);
                return true;
            }
        }
    }

    //Diagonal
    //Down
    for (int i = 0; i <= values.length - 4; i++){
        for(int j = 0; j <= values[0].length - 4; j++){
            if (values[i][j] == values[i + 1][j + 1] &&
                    values[i + 1][j + 1] == values[i + 2][j + 2] &&
                    values[i + 2][j + 2] == values[i + 3][j + 3]){
                System.out.println("diag down "+i+" "+j);
                return true;
            }
        }

    }
    //Up
    for (int i = values.length-1; i >= 3; i--){
        for(int j = 0; j <= values[0].length - 4; j++){
            if (values[i][j] == values[i - 1][j + 1] &&
                    values[i - 1][j + 1] == values[i - 2][j + 2] &&
                    values[i - 2][j + 2] == values[i - 3][j + 3]){
                System.out.println("diag up "+i+" "+j);
                return true;
            }
        }
    }

    return false;
}

И вот еще несколько (положительных) тестов. Когда вы проводите тестирование, не забудьте также включить несколько отрицательных тестовых случаев! И не включайте только квадратичные c матрицы, используйте также неквадратичные c!

7 4
0 1 0 1
1 0 2 0
0 1 2 1
1 0 2 0
0 1 0 1
1 2 1 0
0 1 0 1

5 5
2 0 1 1 0
1 0 1 0 1
0 1 2 1 0
0 0 2 0 0
2 1 1 1 1

5 5
2 0 1 1 0
2 1 1 0 1
0 0 1 1 0
0 0 2 1 0
2 2 1 1 1
0 голосов
/ 20 июня 2020

Из-за этого условия: j , во внутреннем для l oop вам не хватает проверки последних 4 значений в обоих циклах. (Горизонтальный и вертикальный )

Например, если в строке 6 элементов, таких как 1,2,4,4,4,4. Внутренняя проверка l oop будет проверять только случаи: j = 0: {1,2,4,4} и j = 1: {2,4,4,4}, тогда значение j будет увеличиваться до 2, поскольку j

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...