Кажется, код застрял в потенциальном цикле - PullRequest
1 голос
/ 11 октября 2019

Я пишу ответ на вопрос CCC в java, но каждый раз, когда я что-то вводю, это просто требует бесконечного ввода. Кто-нибудь может мне помочь остановить это?

Ваша задача - написать программу, которая проверяет правильность плана скважины, проверяя, что ствол скважины не пересекает себя. Двумерный план скважины используется для представления вертикального поперечного сечения скважины, и этот план скважины включает некоторое бурение, которое началось с (0, −1) и двигалось к (−1, −5). Вы закодируете в своей программе текущий план скважины, показанный на рисунке ниже:

Формат ввода:

Вход состоит из последовательности пар команд бурения. Пара команд сверления начинается с одного из четырех указателей поворота (d для спада, u для вверх, l для левого и r для правого), за которым следует положительная длина. Существует дополнительная команда сверления, обозначенная q (quit), за которой следует целое число, которое указывает, что программа должна остановить выполнение. Вы можете предположить, что входной сигнал таков, что точка сверления не будет:

  • подниматься над землей, или
  • не будет более чем на 200 единиц ниже уровня земли, или
  • быть на расстоянии более 200 единиц слева от исходной начальной точки, а также
  • на расстоянии более 200 единиц справа от исходной начальной точки.

Формат вывода:

Программа должна продолжать следить за бурением, предполагая, что скважина, показанная на рисунке, уже сделана. Как мы видим, (−1, −5) - это начальная позиция вашей программы. После каждой команды программа должна вывести одну строку с координатами новой позиции сверла и один из двух комментариев safe, если пересечения с предыдущей позицией не было, или DANGER, если былопересечение с предыдущим местоположением скважины. После обнаружения и сообщения о самопересечении ваша программа должна остановиться.

Мой код:

public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        ArrayList<Integer> holeX = new ArrayList<>();
        ArrayList<Integer> holeY = new ArrayList<>();
        String direction;
        boolean danger = false;
        holeX.add(0);
        holeX.add(0);
        for (int i = 0; i < 4; i++) {
            holeX.add(i);
        }
        holeX.add(3);
        holeX.add(3);
        holeX.add(4);
        holeX.add(5);
        holeX.add(5);
        holeX.add(5);
        holeX.add(6);
        for (int i = -3; i > -8; i--) {
            holeX.add(7);
        }
        for (int i = 6; i > -2; i--) {
            holeX.add(i);
        }
        holeX.add(-1);
        holeX.add(-1);

    holeY.add(-1);
    holeY.add(-2);
    for (int i = 0; i < 4; i++) {
        holeY.add(-3);
    }
    holeY.add(-4);
    holeY.add(-5);
    holeY.add(-5);
    holeY.add(-5);
    holeY.add(-4);
    holeY.add(-3);
    holeY.add(-3);
    for (int i = -3; i > -8; i--) {
        holeY.add(i);
    }
    for (int i = 6; i > -2; i--) {
        holeY.add(-7);
    }
    holeY.add(-6);
    holeY.add(-5);

    do {
        direction = sc.next();
        int steps = sc.nextInt();
        switch (direction) {
            case "d":
                for (int i = holeY.get(holeY.size() - 1); i > holeY.get(holeY.size() - 1) - steps; i--) {
                    holeY.add(i);
                    for (int j = 0; j < holeY.size() - 2; j++) {
                        if (Objects.equals(holeY.get(holeY.size() - 1), holeY.get(j)) && Objects.equals(holeX.get(holeX.size() - 1), holeX.get(j))) {
                            danger = true;
                        }
                    }
                }
            case "u":
                for (int i = holeY.get(holeY.size() - 1); i < holeY.get(holeY.size() - 1) + steps; i++) {
                    holeY.add(i);
                    for (int j = 0; j < holeY.size() - 2; j++) {
                        if (Objects.equals(holeY.get(holeY.size() - 1), holeY.get(j)) && Objects.equals(holeX.get(holeX.size() - 1), holeX.get(j))) {
                            danger = true;
                        }
                    }
                }
                break;
            case "l":
                for (int i = holeX.get(holeX.size() - 1); i > holeX.get(holeX.size() - 1) - steps; i--) {
                    holeX.add(i);
                    for (int j = 0; j < holeX.size() - 2; j++) {
                        if (Objects.equals(holeX.get(holeX.size() - 1), holeX.get(j)) && i == holeY.get(j)) {
                            danger = true;
                        }
                    }
                }
                break;
            case "r":
                for (int i = holeX.get(holeX.size() - 1); i < holeX.get(holeX.size() - 1) + steps; i++) {
                    holeX.add(i);
                    for (int j = 0; j < holeX.size() - 2; j++) {
                        if (Objects.equals(holeX.get(holeX.size() - 1), holeX.get(j)) && i == holeY.get(j)) {
                            danger = true;
                        }
                    }
                }
                break;
            default:
                break;
        }
        if (danger == false && !"q".equals(direction)) {
            System.out.println(holeX.get(holeX.size() - 1) + " " + holeY.get(holeY.size() - 1) + "safe");
            System.out.print(" safe");
        } else {
            System.out.println(holeX.get(holeX.size() - 1) + " " + holeY.get(holeY.size() - 1) + " DANGER");
        }
    } while (!"q".equals(direction) && danger == false);
}

holeX и holeY - координаты пробуренной области.

Ввод:

l 2
d 2
r 1
q 0

Выход:

-3 -5 safe
-3 -7 safe
-2 -7 safe

1 Ответ

0 голосов
/ 20 октября 2019

Ну да, у вас бесконечный цикл. Например, case "l".

Я использовал l, а затем 2.

for (int i = holeX.get(holeX.size() - 1); i > holeX.get(holeX.size() - 1) - steps; i--) { holeX.add(i)...

. Вы добавляете что-то в список, и условие получаетпереоценка, которая приводит к бесконечному циклу.

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

...