我正在用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);
}
holeX
和holeY
是钻孔区域的坐标。
输入:
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)...
您向列表中添加某些内容,然后重新评估条件,从而导致无限循环。
我不知道这是否是你想做的,但有帮助的是先将条件提取到变量中,然后无限循环停止。