Java 计算房间数的泛洪填充算法

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;

我正在尝试制作一个泛洪填充算法,计算由墙围起来的空白空间的数量。 我使用的是一个二维字符串数组,墙由“1”表示,空的空格为空。 理想情况下,算法应该检查数组中的每个字符串,在位置映射[x][y]处的字符串不为空的任何点返回,并计算由墙包围的空空间数。 但是现在我得到了一个非常长的房间数量,我不知道我会错在哪里

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;
    
  • 您要填充什么阵列?

    我不是JAVA程序员,所以我在这方面可能是错的,但如果我使用C++类比,那么:

    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
    字符可能会很危险,因为某些字符串操作会将其用作字符串终止符。不确定您的JAVA
    string
    是否也是这种情况,但如果是,例如在第一个映射行中,通常是外层空间,因此该行可能以
    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)