我正在进行扫雷任务。我使用递归来实现删除空区域的函数。然而,我的程序总是流行起来。错误消息指出: 线程“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;
}
}
答案 0 :(得分:1)
您可以递归地检查每个图块的每个可能方向。 假设您的代码为0,0现在它检查上面的磁贴。现在它在0,1。然后,从0,1开始,您的代码会检查几个方向,包括向下。现在回到0,0。这无限重复,导致堆栈溢出。
我建议使用一种名为memoization的东西。
创建一个与您的扫雷网格尺寸相同的shapeless
。检查正方形时,请标记boolean[][]
。
在方法的顶部,您可以检查自己是否已经出界,请使用boolean[y][x]=true
检查您是否已经在那里检查过。