1

汎用リストに格納されている座標のリストがあります。リストを反復処理して、座標が互いに隣接しているかどうかを確認できるようにしたいと考えています。もしそうなら、私はそれが同じグループからのものであるのか、そうでない場合であるのかを知っています. これを適切に行う方法を知っている人はいますか?

更新: これまでの私の更新されたコードは次のとおりです。新しい汎用リストで座標をグループ化し、それらが隣接していて同じタイプである場合はそれらを辞書に追加しています。

Dictionary にグループ内の座標が既に含まれているかどうかを知りたいと思います。したがって、同じプロセスを再度実行することはありません。ディクショナリ内のジェネリック リストの値にアクセスするにはどうすればよいですか?

    private void groupMatchTile(List<int[]> matchTile){
        int i = 0;
        Dictionary<int, List<int[]>> groups = new Dictionary<int, List<int[]>>();

        foreach(int[] coord in matchTile){
            if(groups.ContainsValue(

            // How do you check if the coords already belong in a group

            )) return;

            groups.Add(i, new List<int[]>());   
            groups[i].Add(coord);

            foreach(int[] nextCoord in matchTile){
                if (coord == nextCoord) return;
                else {
                    if (    isAdjacent(coord[0], coord[1], nextCoord[0], nextCoord[1]) &&
                            level.grid[coord[0], coord[1]] == level.grid[nextCoord[0], nextCoord[1]]
                    ){
                        groups[i].Add(nextCoord);   
                    }
                }
            }

            i++;
        }   
    }
4

1 に答える 1

0

O(n^2)検索を避けるために、おそらくより良いデータ構造が必要です。多分2D配列?現在のリストからそれを構築するために必要な作業は、それだけの価値があるかもしれません.

また、各ポイントのグループ ID を追跡する必要があります。これは、isAdjacent関数が推移性を提供しないためです。つまり、3 つの点がx方向のみで 1 単位異なる場合、それらを同じグループに含める必要がisAdjacent (p1, p3)ありますが、false.

次に、あなたのロジックは次のようになります

if (isAdjacent (point1, point2)) {
    point1.groupID = point2.groupID = min (point1.groupID, point2.groupID)
}
于 2013-05-19T05:00:10.337 に答える