Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/357.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 洪水填充-扫雷艇,需要解释_Java_Algorithm_Flood Fill - Fatal编程技术网

Java 洪水填充-扫雷艇,需要解释

Java 洪水填充-扫雷艇,需要解释,java,algorithm,flood-fill,Java,Algorithm,Flood Fill,我正在尝试用Java制作一个类似扫雷舰的游戏,我已经完成了大部分工作。我需要帮助的是洪水填充- 有人能解释一下它是怎么工作的吗?我在网上查过,但我不太明白其中的解释,所以我想在这里问会更容易 在我的扫雷艇上,我有: JButton[] btn = new JButton[100]//buttons being clicked and displaying the values/bombs int[] mines = new int[100];//int array holding the val

我正在尝试用Java制作一个类似扫雷舰的游戏,我已经完成了大部分工作。我需要帮助的是洪水填充-

有人能解释一下它是怎么工作的吗?我在网上查过,但我不太明白其中的解释,所以我想在这里问会更容易

在我的扫雷艇上,我有:

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);

这是一个递归算法。从二维栅格[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;
   }
}

(对网格边界进行局部检查)

这是一种递归算法。从二维栅格[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;
   }
}

(对网格边界进行现场检查)

我想你主要是问洪水填充问题。 实际上,它是一种简单而常见的递归算法。它可以解决任何您的数据结构是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;
   }
}
你应该记住的一件事是,floodfill和几乎所有的递归算法都需要检查边界。否则,你可能会进入一个无限循环或得到一个错误的结果。 在上述示例(1D版本)中,u应检查是否:
pos>=1&&pos=1&&x=1&&y我想你主要是问洪水泛滥的问题。 实际上,它是一种简单而常见的递归算法。它可以解决任何您的数据结构是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;
   }
}
你应该记住的一件事是,floodfill和几乎所有的递归算法都需要检查边界。否则,你可能会进入一个无限循环或得到一个错误的结果。 在上述示例(1D版本)中,u应检查是否:
pos>=1&&pos=1&&x=1&&y您真的应该使用a来组织您的地雷/按钮。这将使您更容易理解代码。示例:JButton[][]btn=newjbutton[10][10];代替JButton[]btn=新JButton[100];通过这样做,您可以使用XY值访问您的矿山,而不是像现在这样混淆您访问矿山的方式。@Lucero这怎么可能不编译?事实上,我刚刚编译了这段代码,它运行得很好。我知道你不能创建这样的锯齿状数组,但他不需要。@jesuplusplus:Your
JButton[]]btn=new JButton[10][10]
不创建多维数组,而是(在本例中)创建10个嵌套数组。这就是所谓的“锯齿数组”。@Lucero我认为锯齿数组是这样的:int[][]ints=newint[5][]@JesusPlusPlus,
[10][10]
只是创建锯齿数组所有内部数组的循环的语法糖。Java没有多维数组。你真的应该用a来组织你的地雷/按钮。这将使您更容易理解代码。示例:JButton[][]btn=newjbutton[10][10];代替JButton[]btn=新JButton[100];通过这样做,您可以使用XY值访问您的矿山,而不是像现在这样混淆您访问矿山的方式。@Lucero这怎么可能不编译?事实上,我刚刚编译了这段代码,它运行得很好。我知道你不能创建这样的锯齿状数组,但他不需要。@jesuplusplus:Your
JButton[]]btn=new JButton[10][10]
不创建多维数组,而是(在本例中)创建10个嵌套数组。这就是所谓的“锯齿数组”。@Lucero我认为锯齿数组是这样的:int[][]ints=newint[5][]@JesusPlusPlus,
[10][10]
只是创建锯齿数组所有内部数组的循环的语法糖。Java没有多维数组@这是否意味着我必须修改行和列的代码?得到x&y@Exikle,您应该创建具有X和Y坐标的通用访问器,用于获取和设置网格中的值/状态。网格存储数据的方式与此无关,您可以通过改变访问器的工作方式来改变这一点(一维数组很好,但它应该仍然是一个只影响访问器的实现细节)@Exikle,这正是jesuplusplus所说的。创建访问数据的方法,这样做可以使数据在其余代码中的实际存储方式变得无关。@Exikle:在本示例中,
btn
将是getter(例如,它返回一个对象),并且(注意上面的代码缺少一个点)
isfilleble
将是一个字段(或方法-在这种情况下添加参数)。
fillBtn
将成为setter,它将其标记为已填充,并将
isFillable
设置为false,以便泛光填充不会再次尝试填充它。@Exikle,这是一个需要编写的方法。它检索
JButton
(或者更好,是一个包装器对象)在索引
x
y
@rmeller处,这是否意味着我必须修改行和列的代码才能得到x&y@Exikle,您应该创建一个通用访问器,该访问器具有X和Y坐标,用于获取和设置网格中的值/状态。那么,网格存储数据的方式与此无关,您只需改变访问器的工作方式(一维数组很好,但它应该仍然是一个只影响访问器的实现细节)@Exikle,这正是jesuplusplus所说的。创建访问数据的方法,这样做可以使数据在其余代码中的实际存储方式变得无关紧要。@E