代码似乎卡在了潜在的循环中



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

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

输入格式:

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

  • 高出地面,也不是
  • 地下超过200个单位,也不是
  • 在原始起点左侧超过 200 个单位,也不是
  • 在原始起点右侧超过 200 个单位。

输出格式:

该程序应继续监测钻井,假设图中所示的井已经完成。正如我们所看到的(−1, −5)是程序的起始位置。在每个命令之后,程序必须输出一行,其中包含钻头新位置的坐标,如果与先前的位置没有交集,则DANGER与先前钻孔位置相交,则safe两个注释之一。检测并报告自交集后,程序必须停止。

我的代码是:

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

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

我用了l然后2.

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

您向列表中添加某些内容,然后重新评估条件,从而导致无限循环。

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

相关内容

  • 没有找到相关文章

最新更新