我有一个填充了一些数据的两个dimmentional数组。我想选择所有具有相同的值字段中的字段[0] [0]连接到它的方式呈现下面的图片:如何在二维数组中选择具有相同值的相邻字段
矩阵的实施例与我想字段选择以绿色突出显示(选择的字段至少通过四条边中的一条相邻(N,W,S,E):
您能想到一些简单的算法,可以实现吗?不希望某些准备使用代码 - 更像是一些指导原则。
我有一个填充了一些数据的两个dimmentional数组。我想选择所有具有相同的值字段中的字段[0] [0]连接到它的方式呈现下面的图片:如何在二维数组中选择具有相同值的相邻字段
矩阵的实施例与我想字段选择以绿色突出显示(选择的字段至少通过四条边中的一条相邻(N,W,S,E):
您能想到一些简单的算法,可以实现吗?不希望某些准备使用代码 - 更像是一些指导原则。
嗯,这样的事情也许......?
设置match
等于(0,0)的内容。 创建清单open
和清单closed
。 将(0,0)推到open
。
虽然open
包含元素:{弹出元素关闭open
并将其推送到closed
。查看矩阵中所有与该元素相邻的插槽以及其内容等于match
的每个相邻插槽:{获取该插槽的坐标,并且如果坐标不在closed
或open
中,则将它们推送到open
。 }}
一旦完成,closed
应该包含所需的坐标列表。
感谢您的提示,我想出了这个解决方案:
function findAdjacent(matrix){
var x= 0,y=0; //starting point
return check(x,y,matrix);
}
function check(x,y,matrix){//where the recursive magic happens
if(matrix[x][y]==1){
checked[x][y]="1";
if(x-1>=0 && matrix[x-1][y]==1 && checked[x-1][y]!=1){
check(x-1,y,matrix);
}
if(y-1>=0 && matrix[x][y-1]==1 && checked[x][y-1]!=1){
check(x,y-1,matrix);
}
if(x+1<matrix.length && matrix[x+1][y]==1 && checked[x+1][y]!=1){
check(x+1,y,matrix);
}
if(y+1<matrix.length && matrix[x][y+1]==1 && checked[x][y+1]!=1){
check(x,y+1,matrix);
}
}
return checked;
}
var startingMatrix = [];
startingMatrix[0] = [1,2,3,4,5,6,7,1];
startingMatrix[1] = [1,1,3,4,1,6,1,1];
startingMatrix[2] = [1,1,1,1,1,1,7,1];
startingMatrix[3] = [5,1,1,1,5,1,7,1];
startingMatrix[4] = [5,2,3,4,1,1,7,1];
startingMatrix[5] = [1,2,1,4,5,1,1,1];
startingMatrix[6] = [1,1,1,1,1,1,0,1];
startingMatrix[7] = [1,1,3,4,4,1,3,1];
var checked=[]; //empty matrix for marking up checked files
checked[0] = [0,0,0,0,0,0,0,0];
checked[1] = [0,0,0,0,0,0,0,0];
checked[2] = [0,0,0,0,0,0,0,0];
checked[3] = [0,0,0,0,0,0,0,0];
checked[4] = [0,0,0,0,0,0,0,0];
checked[5] = [0,0,0,0,0,0,0,0];
checked[6] = [0,0,0,0,0,0,0,0];
checked[7] = [0,0,0,0,0,0,0,0];
(function() {
document.write("<br>");
findAdjacent(startingMatrix);
})();
这似乎是工作得很好。但是肯定有一些方法可以改进这个代码,对吧?
[Flood fill](https://en.wikipedia.org/wiki/Flood_fill)就是你要找的东西。 – kryger 2013-05-04 22:30:47