У меня есть код, который должен найти самую маленькую из 8 соседних ячеек в 2D-массиве. Когда этот код запускается, самое маленькое затем перемещается в, а код запускается снова в цикле. Однако, когда он запускается, код заканчивается тем, что приводит к ошибке, поскольку он продолжает прыгать между двумя точками. Кажется, это логический парадокс, как если бы Y <X, тогда X! <Y. Поэтому он считает, что это мой код, а не моя логика. Вот мой код:
private Point findLowestWeight(Point current) {
float lowest = Float.MAX_VALUE;
Point ret = new Point(-1, -1);
LinkedList<Point> pointList = new LinkedList<Point>();
for (int i = -1; i <= 1; i++) {
for (int j = -1; j <= 1; j++) {
if (!(i == 0 && j == 0)) {
if ((current.x + i >= 0 && current.x + i <= imageX - 2)
&& (current.y + j >= 0 && current.y + j <= imageY - 2)) {
pointList.add(new Point(current.x + i, current.y + j));
}
}
}
}
for (Point p : pointList){
if (map[p.x][p.y] < lowest){
lowest = map[p.x][p.y];
ret = p;
}
}
return ret;
}
Вам нужен случай остановки.
найти самую маленькую из 8 соседних ячеек в 2D-массиве. Когда этот код запускается, самое маленькое затем перемещается в, и код запускается снова в цикле
это прекрасный способ начать, но ничего не говорит о прекращении.
Вы заботитесь о ценности текущей ячейки? Если это так, вам нужно проверить 9 не 8. Если вы просто хотите спуститься вниз по холму, вам нужно проверить, где вы были, или любая плоская многоклеточная долина приведет вас в бесконечный цикл. Рассмотрите движение только при движении вниз.
Если вам по-настоящему не важно, где вы, то даже одна долина клеток приведет вас в бесконечный цикл, когда вы подпрыгнете и выйдете из него. В этом случае вам понадобится другое условие остановки. Рассмотрите возможность остановки после imageX * imageY
.
Вы двигаетесь, даже если самый маленький сосед больше значения в центре? Пример:
2 2 2 2
2 0 1 2
2 2 2 2
Вы начинаете с центральной ячейки 0. Самый маленький сосед - 1. Если вы переместитесь на 1, наименьший сосед равен 0. Вы можете продолжать бесконечно. Вероятно, вы не должны двигаться, если самый маленький сосед больше текущей ячейки.
lowest
сmap[current.x][current.y]
чтобы увидеть, действительно ли необходим обмен баллов.