简单的泛洪填充方法会导致StackOverFlow错误

时间:2017-10-20 16:22:54

标签: java arrays stack-overflow flood-fill minesweeper

我的洪水填充方法:

public void fillNeighbours(int x, int y) {
    for(int i = -1; i < 2; i++) {
        for(int j = -1; j < 2; j++) {
            try {
                visible[x+i][y+j] = true;

                if(num[x+i][y+j] == 0) {
                    fillNeighbours(x+i, y+j);
                }
            } catch (ArrayIndexOutOfBoundsException ignored) {}
        }
    }
}

catch (ArrayIndexOutOfBoundsException ignored) {}用于避免x和/或y位置超出数组。数组大小是30比30.我正在像游戏一样进行扫雷。所以你可能知道为什么我需要这个方法以及它应该如何工作。如果你不知道什么是扫雷,那么这里有关于该游戏的快速视频:Introduction to minesweeper

3 个答案:

答案 0 :(得分:1)

代码重新访问已设置为可见的字段。

尝试类似

的内容
if(!visible[x+i][y+j]){
  visible[x+i][y+j] = true;
  if(num[x+i][y+j] == 0) {
    fillNeighbours(x+i, y+j);
  }
}

答案 1 :(得分:0)

看起来你没有任何突破子句(基本情况)递归调用fillNeighbours,所以调用填满了堆栈。

从  Wikistack

递归的树定律是

  1. 递归算法必须具有基本情况。
  2. 递归算法 必须改变其状态并走向基本案例。
  3. 递归 算法必须递归调用自身。

答案 2 :(得分:0)

一旦fillNeighbours找到一个单元并自行调用,当i和j等于零时,下一个循环将始终调用另一个循环。所以它永远不会退出,并在堆栈装满后崩溃。

除此之外,它会生成一个非常深的树,因为它没有跟踪哪些单元格被递归,并且会多次在同一个单元格上调用fillNeighbours。