我有一些代码可以找到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;
}
答案 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.您可以继续无休止。 如果最小的邻居大于当前的小区,你可能不应该移动。