java - 代码似乎陷入了潜在的循环
问题描述
我正在用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
解决方案
嗯,是的,你有一个无限循环。让我们举个case "l"
例子。
我用l
然后2
。
for (int i = holeX.get(holeX.size() - 1); i > holeX.get(holeX.size() - 1) - steps; i--) {
holeX.add(i)...
您将某些内容添加到列表中,然后重新评估条件,这会导致无限循环。
我不知道这是否是您想要做的,但有帮助的是首先将条件提取到变量中,然后无限循环停止。
推荐阅读
- html - 定位日历
- powershell - Azure devops rest api 仅返回 100 个项目
- powershell - Powershell 在 csv 中查找符合条件的最新条目
- python - Python命令提示出现速度很慢(Anaconda)
- flutter - 自定义画家不起作用。反而出现白屏
- python - 在python中通过多处理传递openpyxl Workbook对象
- angular - 如何修改 Angular 货币的小数位数?
- ruby-on-rails - 我做错什么了:Rails with_lock?
- mongodb - Kafka 下沉到 mongoDB,如何将“_ID”字段设置为主题中某一列中的现有值?
- python - numpy数组中的元素减法