Java 计算房间数的泛洪填充算法
我正在尝试制作一个泛洪填充算法,计算由墙围起来的空白空间的数量。 我使用的是一个二维字符串数组,墙由“1”表示,空的空格为空。 理想情况下,算法应该检查数组中的每个字符串,在位置映射[x][y]处的字符串不为空的任何点返回,并计算由墙包围的空空间数。 但是现在我得到了一个非常长的房间数量,我不知道我会错在哪里Java 计算房间数的泛洪填充算法,java,algorithm,dictionary,multidimensional-array,flood-fill,Java,Algorithm,Dictionary,Multidimensional Array,Flood Fill,我正在尝试制作一个泛洪填充算法,计算由墙围起来的空白空间的数量。 我使用的是一个二维字符串数组,墙由“1”表示,空的空格为空。 理想情况下,算法应该检查数组中的每个字符串,在位置映射[x][y]处的字符串不为空的任何点返回,并计算由墙包围的空空间数。 但是现在我得到了一个非常长的房间数量,我不知道我会错在哪里 public static void floodFill(int x, int y, String oldChar, String newChar){ x = 0;
public static void floodFill(int x, int y, String oldChar, String newChar){
x = 0;
y=0;
if (x < 0 || y < 0 || x > map.length || y > map[0].length ){
return;
}
if (map[x][y] != oldChar){
return;
}
map[x][y] = newChar;
// Recursive calls
floodFill(x - 1, y, oldChar, newChar);
floodFill(x +1, y, oldChar, newChar);
floodFill( x, y-1, oldChar, newChar);
floodFill(x, y+1, oldChar, newChar);
}
public static void getNumOfRooms(String map[][]){
roomCount = -1;
for(x = 0; x < map.length; x++){
for (y = 0; y < map[0].length; y++){
if (map[x][y] == null){
floodFill(x, y, null, "x");
roomCount+=1;
System.out.println(map);
}
}
}
publicstaticvoidfloodfill(intx,inty,stringoldchar,stringnewchar){
x=0;
y=0;
if(x<0 | | y<0 | | x>map.length | | y>map[0].length){
返回;
}
if(map[x][y]!=oldChar){
返回;
}
map[x][y]=newChar;
//递归调用
洪水填充(x-1,y,oldChar,newChar);
溢流填充(x+1,y,oldChar,newChar);
洪水填充(x、y-1、oldChar、newChar);
洪水填充(x,y+1,oldChar,newChar);
}
公共静态void getNumOfRooms(字符串映射[][]){
房间数=-1;
对于(x=0;x
懒得尝试你的代码,但这里有一些事情(一些已经在评论中提到):
map[][]
检查递归调用时丢失了
是的,你有这个:
if (x < 0 || y < 0 || x > map.length || y > map[0].length ) return;
public static void getNumOfRooms(String map[][])
将创建map[][]
的新本地副本,以便访问内部的本地副本(除非这意味着指针不是数组副本)。因此,您可能正在检查本地副本中的值,但洪水填充正在访问原始地图:
public static void floodFill(int x, int y, String oldChar, String newChar)
因此,本地map[][]]
中的任何更改都不会导致您计算的是空间而不是房间的数量。我将从getNumOfRooms
头中删除String map[][]
操作数,以解决这一问题-1
,这是incorrect(如果没有外层空间怎么办)应该是0
null
字符
在某些情况下,在字符串中使用null
字符可能会很危险,因为某些字符串操作会将其用作字符串终止符。不确定您的JAVAstring
是否也是这种情况,但如果是,例如在第一个映射行中,通常是外层空间,因此该行可能以null
开头,这会改变map[0]。对于某些破坏地图布局的操作,长度为零。我会使用ASCII空格
,这样更安全,也更容易打印出地图
为什么要在floodFill()的顶部将x和y设置为0?floodFill参数不应该是(x+1,y),(x-1,y),(x,y+1),(x,y-1)?您有一些可疑的坐标对。roomCount不应该从0开始吗?如果我没有将x和y设置为0,我会得到一个数组越界错误。基本上,我希望它从0开始搜索整个数组[0,0]。是的,配对已更正。roomCount为-1,因为它应将外部区域计为1个空间。移动
x=0;y=0;
将修复代码。对于找到的每个空正方形,您希望用“x”填充该房间,并计算1个房间。相反,您每次都在填充同一个房间(第二次和后续洪水填充不起任何作用,因为map[0][0]
已设置为“x”)。此外,在边界检查中,您可能需要=
而不是
。并且,您可能需要在程序不工作时调试程序,而不是随机更改,希望它能够修复代码…非常感谢!在按照您的指导原则进行一些调整后,它成功地打印阵列中的房间总数。No No No modHFGen.dll万分感激
public static void floodFill(int x, int y, String oldChar, String newChar)