[JAVA]递归移除扫雷中的空单元格

时间:2018-05-07 17:24:41

标签: java recursion

我正在进行扫雷任务。我使用递归来实现删除空区域的函数。然而,我的程序总是流行起来。错误消息指出: 线程“AWT-EventQueue-0”中的异常java.lang.StackOverflowError

这是我的代码,我知道它看起来很乱,提前道歉。我将不胜感激任何帮助!

public void removeEmptyRegion(int x, int y){ //note: uses recursive decomposition
    if (x < 0 || x > width-1 || y < 0 || y > length-1) {
        return; // check for bounds
    }else if(tiles[y][x].getClicked()){ //first time activated this method
        //checks the tiles surround it
        removeEmptyRegion(x,y+1);//up
        removeEmptyRegion(x,y-1);//down
        removeEmptyRegion(x+1,y);//left
        removeEmptyRegion(x-1,y);//right
        removeEmptyRegion(x-1, y+1); //up-left
        removeEmptyRegion(x+1, y+1); //up-right
        removeEmptyRegion(x-1,y-1); //down-left
        removeEmptyRegion(x+1,y-1); //down-right
    }
    else if(!(tiles[y][x].getValue() == -1) && tiles[y][x].getClicked() == false ) { 
        //check: -1 indicates it is a bomb
        if(tiles[y][x].getValue() == 0) {
            tiles[y][x].clickTile();
            //chain reaction
            removeEmptyRegion(x,y+1);//up
            removeEmptyRegion(x,y-1);//down
            removeEmptyRegion(x+1,y);//left
            removeEmptyRegion(x-1,y);//right
            removeEmptyRegion(x-1, y+1); //up-left
            removeEmptyRegion(x+1, y+1); //up-right
            removeEmptyRegion(x-1,y-1); //down-left
            removeEmptyRegion(x+1,y-1); //down-right
            return;
        }else { //stops if the tile is a numbered tile
            tiles[y][x].clickTile();
            return;
        }
    } else {
        return;
    }
}

1 个答案:

答案 0 :(得分:1)

您可以递归地检查每个图块的每个可能方向。 假设您的代码为0,0现在它检查上面的磁贴。现在它在0,1。然后,从0,1开始,您的代码会检查几个方向,包括向下。现在回到0,0。这无限重复,导致堆栈溢出。

我建议使用一种名为memoization的东西。

创建一个与您的扫雷网格尺寸相同的shapeless。检查正方形时,请标记boolean[][]

在方法的顶部,您可以检查自己是否已经出界,请使用boolean[y][x]=true检查您是否已经在那里检查过。