Как узнать, в каких позициях могут столкнуться два ферзя. (Шахматы 8x8) - PullRequest
1 голос
/ 26 мая 2020

Я написал программу, которая обнаруживает, что две позиции ферзя могут столкнуться. Можно ли сделать лучше и с меньшим кодом:

import java.util.Scanner;

class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int x1 = scanner.nextInt();
        int y1 = scanner.nextInt();
        int x2 = scanner.nextInt();
        int y2 = scanner.nextInt();

        if (x1 == x2 || y1 == y2) {
            System.out.println("YES");
        }
        else if (x1 == x2 || y1 == y2) {
            System.out.println("YES");
        }
        else if (Math.abs(x1 - x2) == Math.abs(y1 - y2)) {
            System.out.println("YES");
        }else{
            System.out.println("NO");
        }
    }
}

Ответы [ 2 ]

1 голос
/ 26 мая 2020

В реализации есть повторяющаяся проверка: Второй блок if такой же, как и первый блок if.

public boolean checkQueens_v1(int x1, int y1, int x2, int y2) {
    if ( (x1 == x2) || (y1 == y2) ) {
        return true;
    } else if ( Math.abs(x1 - x2) == Math.abs(y1 - y2) ) {
        return true;
    } else{
        return false;
    }
}

Альтернатива:

public boolean checkQueens_v2(int x1, int y1, int x2, int y2) {
    int xdiff = x1 - x2;
    if ( xdiff == 0 ) {
        return true;
    }
    int ydiff = y1 - y2;
    if ( ydiff == 0 ) {
        return true;
    }
    if ( Math.abs(xdiff) == Math.abs(ydiff) ) {
        return true;
    }
    return false;
}

Что меньше / быстрее, сказать сложно:

Первый тест состоит из трех сравнений и двух вычитаний. Второй тест имеет два сравнения с нулем, одно сравнение и два вычитания.

Но второй тест выполняет свои вычитания чаще, чем первый тест.

1 голос
/ 26 мая 2020
if (x1 == x2 || y1 == y2 || (Math.abs(x1 - x2) == Math.abs(y1 - y2))) {
    System.out.println("YES");
} else {
    System.out.println("NO");
}

else if (x1 == x2 || y1 == y2) {
    System.out.println("YES");
}

Это условие является избыточным.


else if (Math.abs(x1 - x2) == Math.abs(y1 - y2)) {
    System.out.println("YES");
}

Это может быть объединено с предыдущим условием, поскольку оно имеет тот же результат.

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