如何在二维数组中选择具有相同值的相邻字段

时间:2013-05-04 22:26:04

标签: javascript recursion

我有一个填充了一些数据的双层阵列。我想选择与字段[0] [0]具有相同值的所有字段,这些字段以下图中显示的方式连接到它:

highlighted fields

我希望选择以绿色突出显示的字段的矩阵示例(所选字段至少由四边(N,W,S,E)中的一边相邻:

你能想到一些容易实现这一目标的算法吗?我不希望一些准备使用的代码 - 更像是一些指导方针。

3 个答案:

答案 0 :(得分:3)

使用递归算法。检查每个相邻的单元格,如果匹配则以该单元格作为起点进行递归。收集列表中的所有匹配单元格。要避免无限循环,请在递归之前检查单元格是否已在结果列表中。

答案 1 :(得分:0)

嗯,这样的事可能......?

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

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

完成后,closed应包含所需的坐标列表。

答案 2 :(得分: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);

    })();

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