瓦片映射JavaScript中的填充封闭区域算法

瓦片映射JavaScript中的填充封闭区域算法,javascript,dictionary,autofill,flood-fill,Javascript,Dictionary,Autofill,Flood Fill,对不起我的英语 我有一个问题,下一个问题是什么: 例如,我有一张地图: var map = [[0,1,1,0,0,0,0,0,0,0], [0,1,0,1,0,1,1,0,0,0], [0,1,0,0,1,0,0,1,0,0], [0,1,0,0,0,0,0,0,1,0], [0,0,1,0,0,0,0,1,0,0], [0,0,0,1,0,0,0,1,1,0], [0,0,1,0,0,0,1,0,0,0], [0,1,0,0,

对不起我的英语

我有一个问题,下一个问题是什么:

例如,我有一张地图:

var map = 
    [[0,1,1,0,0,0,0,0,0,0],
    [0,1,0,1,0,1,1,0,0,0],
    [0,1,0,0,1,0,0,1,0,0],
    [0,1,0,0,0,0,0,0,1,0],
    [0,0,1,0,0,0,0,1,0,0],
    [0,0,0,1,0,0,0,1,1,0],
    [0,0,1,0,0,0,1,0,0,0],
    [0,1,0,0,0,0,0,1,0,0],
    [1,0,0,1,1,1,0,1,0,0],
    [0,1,1,0,0,1,1,1,0,0]];
它包含一系列数字0和1(例如)。我需要填写地图上所有的封闭框,例如使用数字2

例如:

var map = 
    [[0,1,1,0,0,0,0,0,0,0],
    [0,1,2,1,0,1,1,0,0,0],
    [0,1,2,2,1,2,2,1,0,0],
    [0,1,2,2,2,2,2,2,1,0],
    [0,0,1,2,2,2,2,1,0,0],
    [0,0,0,1,2,2,2,1,1,0],
    [0,0,1,2,2,2,1,0,0,0],
    [0,1,2,2,2,2,2,1,0,0],
    [1,2,2,1,1,1,2,1,0,0],
    [0,1,1,0,0,1,1,1,0,0]];
考虑到:

  • 正如本例中只有一个闭合图形一样,也可以有多个闭合图形
  • 地图的侧面将不予考虑
  • 如果有任何用处,数字1(即实数)将 随着时间的推移而生成,因此地图将不断变化 (类似于数组中的笔划)

  • 我发现了一个名为“洪水填充”的方法,但它取决于一个起点,在本例中,它没有起点。其思想是,代码负责查找闭合区域并自动填充它们。

    如果没有起始坐标,则识别每一个要填充的0的一种方法是识别边上的每一个0。这些0中的每一个都不应该被填充,最终与这些0相邻的每个0也不应该被填充。因此,如果您将边0作为“起点”,并遍历它们的所有递归邻居,您将识别出每个坐标,该坐标为0,但不应填充

    然后,很简单:只需迭代输入,每0检查一次当前坐标是否在不应填充的坐标集中。如果坐标不在该集中,则替换为2

    var映射=
    [[0,1,1,0,0,0,0,0,0,0],
    [0,1,2,1,0,1,1,0,0,0],
    [0,1,2,2,1,2,2,1,0,0],
    [0,1,2,2,2,2,2,2,1,0],
    [0,0,1,2,2,2,2,1,0,0],
    [0,0,0,1,2,2,2,1,1,0],
    [0,0,1,2,2,2,1,0,0,0],
    [0,1,2,2,2,2,2,1,0,0],
    [1,2,2,1,1,1,2,1,0,0],
    [0,1,1,0,0,1,1,1,0,0]];
    常量高度=贴图长度;
    常量宽度=映射[0]。长度;
    const edgeZerosCoords=新集合();
    map.forEach((arr,row)=>{
    arr.forEach((num,col)=>{
    如果(num==0&&(row==0 | | col==0 | | row==width-1 | | col==height-1)){
    add(`${row}{col}`);
    }
    })
    });
    const doNotFillCoords=new Set();
    const visted=新集合();
    常量checkCoord=(行、列)=>{
    //验证有效的协调:
    if(row<0 | | col<0 | | row==宽度| | col==高度)返回;
    常量str=`${row}{col}`;
    如果(doNotFillCoords.has(str)| | visitor.has(str))返回;
    访问。添加(str);
    const num=映射[行][列];
    如果(num!==0)返回;
    doNotFillCoords.add(str);
    检查坐标(行+1,列);
    checkCoord(第1行,第2列);
    检查坐标(行、列+1);
    checkCoord(世界其他地区,第1列);
    };
    对于(edgeZerosCoords的const str){
    常量[行,列]=str.split(“”“).map(编号);
    检查坐标(行、列)
    }
    map.forEach((arr,row)=>{
    arr.forEach((num,col)=>{
    常量str=`${row}{col}`;
    如果(num==0&&!doNotFillCoords.has(str)){
    地图[行][col]=2;
    }
    })
    });
    
    log(JSON.stringify(map))