Нахождение наименьшего соседа в 2D массиве

1

У меня есть код, который должен найти самую маленькую из 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;
}
  • 0
    Для чего именно imageX и imageY?
  • 0
    Если вы ищите соседей и исключаете центр, то всегда будет обмен. Вы должны сравнить lowest с map[current.x][current.y] чтобы увидеть, действительно ли необходим обмен баллов.
Показать ещё 2 комментария
Теги:
multidimensional-array

2 ответа

0
Лучший ответ

Вам нужен случай остановки.

найти самую маленькую из 8 соседних ячеек в 2D-массиве. Когда этот код запускается, самое маленькое затем перемещается в, и код запускается снова в цикле

это прекрасный способ начать, но ничего не говорит о прекращении.

Вы заботитесь о ценности текущей ячейки? Если это так, вам нужно проверить 9 не 8. Если вы просто хотите спуститься вниз по холму, вам нужно проверить, где вы были, или любая плоская многоклеточная долина приведет вас в бесконечный цикл. Рассмотрите движение только при движении вниз.

Если вам по-настоящему не важно, где вы, то даже одна долина клеток приведет вас в бесконечный цикл, когда вы подпрыгнете и выйдете из него. В этом случае вам понадобится другое условие остановки. Рассмотрите возможность остановки после imageX * imageY.

  • 0
    Ах, спасибо, этот код был вызван из рекурсивной функции, и в предложении остановки была опечатка
0

Вы двигаетесь, даже если самый маленький сосед больше значения в центре? Пример:

2 2 2 2
2 0 1 2
2 2 2 2

Вы начинаете с центральной ячейки 0. Самый маленький сосед - 1. Если вы переместитесь на 1, наименьший сосед равен 0. Вы можете продолжать бесконечно. Вероятно, вы не должны двигаться, если самый маленький сосед больше текущей ячейки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню