我正在用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);
}
holeX
和holeY
是钻孔区域的坐标。
输入:
l 2
d 2
r 1
q 0
输出:
-3 -5 safe
-3 -7 safe
-2 -7 safe
答案 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)...
您在列表中添加了一些内容,条件得到重新评估,从而导致无限循环。
我不知道这是否是您要执行的操作,但有帮助的是先将条件提取到变量中,然后无限循环停止。