2015-04-12 4 views
1

У меня есть код, который должен найти самую маленькую из 8 соседних ячеек в 2D-массиве. Когда этот код запускается, самое маленькое затем перемещается в, а код запускается снова в цикле. Однако, когда он запускается, код заканчивается тем, что приводит к ошибке переполнения стека, поскольку он продолжает прыгать между двумя точками. Кажется, это логичный парадокс, как если бы Y < X, тогда X! < Y. Поэтому он думает, что это мой код в вине, а не моя логика. Вот мой код:Поиск наименьшего соседа в 2D-массиве

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

Для чего предназначены изображенияX и imageY? – CandiedOrange

+0

Если вы ищете через соседей и исключая центр, то всегда будет обмен. Вы должны сравнить 'lower' с' map [current.x] [current.y] ', чтобы увидеть, действительно ли необходим обмен точками. – Fox

+0

imageX и imageY - это ширина и высота массива, из-за того, что структурированы данные, всегда будет меньшее значение для каждой точки, за исключением одного специального случая, который этот код никогда не запускается на –

ответ

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. Вы можете продолжать бесконечно. Возможно, вы не должны двигаться, если самый маленький сосед больше текущей ячейки.

Смежные вопросы