简单洪水填充方法将导致错误计算器

问题描述:

我的洪水填充方法:简单洪水填充方法将导致错误计算器

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

+1

你应该几乎从不忽略/吞下这样的例外。 –

+0

1.计算你的界限,不要使用arrayIndexOutofBoundsExceptions! 2.从你的代码片断中,我们看不到任何会终止你的循环的东西。你一直在调用fillNeighbours。检查是否您的NUM [X + 1] [Y + J]改为别的东西比0 –

代码重温其设置为可见已领域。

尝试像

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

这或'如果(!可见[X + 1] [Y + J])'的OP代码似乎要检查一个变量但设置另一个。这就是说如果要填充的区域很大,堆栈仍然可能溢出。 – Persixty

+0

@Persixty当前数据表示需要两个检查。如果代码在飞行中计算邻居,则-1(假设)可以编码visible = false,并且0 ... 8可以表示visible = true。 – tevemadar

+0

你可能是对的。 OP中的模型不完全清楚。 – Persixty

它看起来像你递归调用fillNeighbours没有任何突围条款(基本情况),因此呼吁填补堆栈。

Wikistack

递归的树法律

  1. 递归算法必须有一个基本情况。
  2. 递归算法 必须改变它的状态,并朝着基座壳体移动。
  3. 递归算法 必须调用本身,递归。

一旦fillNeighbours找到一个单元并调用它自己,当i和j等于零时,下一个循环总是会调用另一个循环。所以它永远不会退出,并且一旦堆栈满了就会崩溃。

除此之外,它会产生一个非常深的树,因为它不跟踪这些细胞已被递归,并调用fillNeighbours同一细胞上多次。