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)搜索。也许是一个二维数组?从当前列表中构建它所需的工作可能是值得的。

您还需要跟踪每个点的组 ID。这是因为您的isAdjacent函数不会给您传递性,即如果三个点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 回答