首页 > 解决方案 > 代码似乎陷入了潜在的循环

问题描述

我正在用java写一个CCC问题的答案,但每次我输入一些东西时,它只需要无限输入。谁能帮我阻止这个?

你的任务是编写一个程序,通过验证井眼不会与自身相交来验证井规划的有效性。二维井平面图用于表示井眼的垂直横截面,该井平面图包括一些从 开始(0, −1)并移动到的钻井(−1, −5)。您将在您的程序中编码当前井计划,如下图所示:

输入格式:

输入由一系列钻孔命令对组成。钻孔命令对以四个方向指示器之一(d向下、u向上、l向左和r向右)开始,后跟正长度。还有一个由 q(退出)后跟一个整数表示的附加钻孔命令,表示程序应该停止执行。您可以假设输入使得钻孔点不会:

  • 高出地面,也不
  • 在地下超过 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);
}

holeXholeY是钻孔区域的坐标。

输入:

l 2
d 2
r 1
q 0

输出:

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

标签: javaloopsarraylistjava.util.scanneruser-input

解决方案


嗯,是的,你有一个无限循环。让我们举个case "l"例子。

我用l然后2

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

您将某些内容添加到列表中,然后重新评估条件,这会导致无限循环。

我不知道这是否是您想要做的,但有帮助的是首先将条件提取到变量中,然后无限循环停止。


推荐阅读