いくつかのデータで満たされた 2 次元配列があります。下の画像に示されている方法でそれに接続されているフィールド [0][0] と同じ値を持つすべてのフィールドを選択したい:
選択したいフィールドが緑色で強調表示されたマトリックスの例 (選択されたフィールドは、4 つの辺 (N、W、S、E) の少なくとも 1 つによって互いに隣接しています。
それを達成するための簡単なアルゴリズムを考えられますか? すぐに使用できるコードを望んでいません-いくつかのガイドラインのようなものです。
いくつかのデータで満たされた 2 次元配列があります。下の画像に示されている方法でそれに接続されているフィールド [0][0] と同じ値を持つすべてのフィールドを選択したい:
選択したいフィールドが緑色で強調表示されたマトリックスの例 (選択されたフィールドは、4 つの辺 (N、W、S、E) の少なくとも 1 つによって互いに隣接しています。
それを達成するための簡単なアルゴリズムを考えられますか? すぐに使用できるコードを望んでいません-いくつかのガイドラインのようなものです。
再帰アルゴリズムを使用します。隣接する各セルをチェックし、一致する場合は、そのセルを開始点として再帰します。一致するすべてのセルをリストに収集します。無限ループを回避するには、セルが再帰する前に結果リストに既にあるかどうかを確認してください。
あなたのヒントのおかげで、私はこの解決策を思いつきました:
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);
})();
うまく機能しているようです。しかし、このコードを改善する方法は確かにありますよね?