FloodFill-扫雷车,需要解释

问题描述 投票:1回答:2

我正在尝试用Java制作类似于Minesweeper的游戏,而我大部分都可以使用。我需要帮助的是FloodFill-http://en.wikipedia.org/wiki/Flood_fill

有人可以解释它的工作原理吗?我已经上网浏览了,但我不太理解其中的解释,因此我认为在这里提问会更容易。

在我的扫雷车上,有:

JButton[] btn = new JButton[100]//buttons being clicked and displaying the values/bombs
int[] mines = new int[100];//int array holding the values for each button.

网格是10x10网格,所以说您单击的按钮是btn [14],

btn[4]  // north of btn[14](14-10)
btn[24] // south of btn[14](14+10)
btn[13] //  west of btn[14](14-1)
btn[15] //  east of btn[14](14+1)

所以回到问题,有人可以向我解释吗?

编辑:我将代码更改为2D,所以现在不是上面的代码了

btn[1][4]//row one, column 4

[单击按钮时,我希望它检查一个名为mines [] []的变量,该变量具有值,并且如果该值等于0(围绕初始单击,它将更改BG]

btn[x][y].setBackground(Color.GRAY);
java algorithm flood-fill
2个回答
7
投票

它是一种递归算法。您可以从2D网格[x,y]的某个起始位置开始,然后朝各个方向查看,并尽可能填充它们。如果(x,y)无法填充,请返回。

void floodFill( int x, int y ) {
   if ( btn( x, y ) isFillable ) {
       fillBtn(x,y);
       floodFill( x+1, y );
       floodFill( x-1, y );
       floodFill( x, y-1 );
       floodFill( x, y+1 );
   } else {
       return;
   }
}

(省略对网格边界的检查)


1
投票

我想您主要是在询问洪水。实际上,这是一种简单且通用的递归算法。它可以解决您的数据结构是1D还是2D的问题。对于2D版本,@ RMoeller给出了答案。对于您以前的1D声明,它也类似如下:

void floodFill( int pos ) {
   if ( btn( pos ) isFillable ) {
       fillBtn(pos);
       floodFill( pos+1 );
       floodFill( pos-1 );
       floodFill( pos+10 );
       floodFill( pos-10 );
   } else {
       return;
   }
}

您应该记住的一件事是,泛洪和几乎所有递归算法都需要检查边界。否则,您可能会陷入无限循环或得到错误的结果。在上面的示例(一维版本)中,您应检查是否:pos> = 1 && pos <= 100与要检查的2D版本类似:x> = 1 && x <= 10 && y> = 1 && y <= 10

希望这会有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.