简单洪水填充方法将导致错误计算器
问题描述:
我的洪水填充方法:简单洪水填充方法将导致错误计算器
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
答
代码重温其设置为可见已领域。
尝试像
if(!visible[x+i][y+j]){
visible[x+i][y+j] = true;
if(num[x+i][y+j] == 0) {
fillNeighbours(x+i, y+j);
}
}
答
它看起来像你递归调用fillNeighbours
没有任何突围条款(基本情况),因此呼吁填补堆栈。
递归的树法律
- 递归算法必须有一个基本情况。
- 递归算法 必须改变它的状态,并朝着基座壳体移动。
- 递归算法 必须调用本身,递归。
答
一旦fillNeighbours找到一个单元并调用它自己,当i和j等于零时,下一个循环总是会调用另一个循环。所以它永远不会退出,并且一旦堆栈满了就会崩溃。
除此之外,它会产生一个非常深的树,因为它不跟踪这些细胞已被递归,并调用fillNeighbours同一细胞上多次。
你应该几乎从不忽略/吞下这样的例外。 –
1.计算你的界限,不要使用arrayIndexOutofBoundsExceptions! 2.从你的代码片断中,我们看不到任何会终止你的循环的东西。你一直在调用fillNeighbours。检查是否您的NUM [X + 1] [Y + J]改为别的东西比0 –