代码似乎陷入了潜在的循环

时间:2019-10-10 21:43:16

标签: java loops arraylist java.util.scanner user-input

我正在用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

1 个答案:

答案 0 :(得分:0)

是的,您有一个无限循环。让我们以case "l"为例。

我先使用l,然后再使用2

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

您在列表中添加了一些内容,条件得到重新评估,从而导致无限循环。

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

相关问题