寻找2D阵列中的最小邻居

时间:2015-04-12 14:19:41

标签: java multidimensional-array

我有一些代码可以找到2D数组中8个相邻单元格中最小的一个。当此代码运行时,最小值将移至,并且代码将在循环中再次运行。但是当它运行时,代码最终会产生堆栈溢出错误,因为它会在两点之间跳跃。这似乎是一个逻辑悖论,好像Y< X然后X!<是的。所以它认为这是我的错误代码,而不是我的逻辑。这是我的代码:

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;
}

2 个答案:

答案 0 :(得分:0)

你需要一个停止案例。

  

找到2D阵列中8个相邻单元中的最小单元。当此代码运行时,最小值将移至,并且代码将在循环中再次运行

是一个很好的开始,但没有说停止。

你关心当前细胞的价值吗?如果需要,你需要检查9而不是8.如果你只是想下山,那么你需要检查你去过的地方,或者任何扁平的多单元格谷会让你陷入无限循环。如果向下移动,请考虑移动。

如果你真的不在乎你所处的位置,那么即使是单个细胞谷也会让你进入一个无限循环,当你反弹进出它时。在这种情况下,您需要一些其他停止条件。考虑在imageX * imageY次迭代后停止。

答案 1 :(得分:0)

即使最小的邻居大于中心的值,你也会移动吗? 例如:

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

从中心单元格0开始。最小邻居为1.如果移动到1,则最小邻居为0.您可以继续无休止。 如果最小的邻居大于当前的小区,你可能不应该移动。