2013-05-04 59 views
4

我有一个填充了一些数据的两个dimmentional数组。我想选择所有具有相同的值字段中的字段[0] [0]连接到它的方式呈现下面的图片:如何在二维数组中选择具有相同值的相邻字段

highlighted fields

矩阵的实施例与我想字段选择以绿色突出显示(选择的字段至少通过四条边中的一条相邻(​​N,W,S,E):

您能想到一些简单的算法,可以实现吗?不希望某些准备使用代码 - 更像是一些指导原则。

+1

[Flood fill](https://en.wikipedia.org/wiki/Flood_fill)就是你要找的东西。 – kryger 2013-05-04 22:30:47

回答

3

使用递归a lgorithm。检查每个相邻的单元格,如果它匹配递归的单元格作为起点。收集列表中的所有匹配单元格。为避免无限循环,请在递归之前检查单元是否已经在结果列表中。

+0

'为了避免无限循环,在递归之前检查单元是否已经在结果列表中'将需要访问,所以不要再次去那里列表? – tgkprog 2013-05-05 00:20:02

+0

@tgkprog每个访问过的地方都在结果列表中。 – Barmar 2013-05-05 00:28:28

0

嗯,这样的事情也许......?

设置match等于(0,0)的内容。 创建清单open和清单closed。 将(0,0)推到open

虽然open包含元素:{弹出元素关闭open并将其推送到closed。查看矩阵中所有与该元素相邻的插槽以及其内容等于match的每个相邻插槽:{获取该插槽的坐标,并且如果坐标不在closedopen中,则将它们推送到open。 }}

一旦完成,closed应该包含所需的坐标列表。

0

感谢您的提示,我想出了这个解决方案:

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); 

    })(); 

这似乎是工作得很好。但是肯定有一些方法可以改进这个代码,对吧?

相关问题