2013-05-19 3 views
1

일반 목록에 저장된 좌표 목록이 있습니다. 목록을 반복하고 어떤 좌표가 서로 인접 해 있는지 확인하고 싶습니다. 그들이 있다면, 나는 그렇지 않은 경우에 비해 동일한 그룹에서 그것을 안다. 아무도 이것을 제대로하는 방법을 알고 있습니까?사전에 일반 목록의 값이 포함되어 있는지 확인하는 방법

업데이트 : 여기까지 지금까지 업데이트 된 코드가 있습니다. 좌표를 새로운 제네릭 목록으로 그룹화하고 인접한 경우 동일한 유형의 사전에 추가합니다.

이제 사전에 이미 그룹의 좌표가 포함되어 있는지 알고 싶습니다. 따라서 동일한 프로세스를 다시 실행하지 않습니다. 사전에있는 generic 목록의 값에 어떻게 액세스합니까?

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++; 
     } 
    } 
+0

같은 것입니다. 우리에게 정의되지 않은 많은 대상들이 있습니다. 코드의 문제점은 무엇입니까? 더 많은 정보를 제공해야합니다. 현재 상황을 설명하십시오. –

+0

확인. 나는 지금 실제로 그것에 종사하고있다. 나는이 문제를 해결하는 방법의 요지를 가지고 있다고 생각한다. 일단 내가 좀 더 얻을이 게시물을 업데이 트됩니다. 메모 주셔서 감사합니다. –

답변

0

O(n^2) 검색을 피하려면 더 나은 데이터 구조가 필요합니다. 어쩌면 2D 배열일까요? 현재 목록에서 구성하는 데 필요한 작업이 그만한 가치가있을 수 있습니다.

또한 각 지점의 그룹 ID를 추적해야합니다. 이는 귀하의 isAdjacent 기능이 귀하에게 과도한 성향을 부여하지 않기 때문입니다. 즉, x 방향으로 3 점이 1 단위 차이가 나면 같은 그룹에 넣기를 원하지만 isAdjacent (p1, p3)false이됩니다.

그런 다음 논리는 당신의 코드를 이해하기 어렵다

if (isAdjacent (point1, point2)) { 
    point1.groupID = point2.groupID = min (point1.groupID, point2.groupID) 
}