瓦片映射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]];
考虑到:
我发现了一个名为“洪水填充”的方法,但它取决于一个起点,在本例中,它没有起点。其思想是,代码负责查找闭合区域并自动填充它们。如果没有起始坐标,则识别每一个要填充的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))非常感谢,这正是我的意思