2014-03-01 4 views
3

게임 (WPF)의 경우 맵 편집기를 만들어야합니다. 지도는 4x3지도 필드의 행렬로 정의됩니다. 사용자가지도를 편집하면 각 입력란을 사용 또는 사용 중지 할 수 있으며지도의 모양을 정의합니다. 이제 각 필드가 다른 필드에 연결된 경우에만 맵이 유효합니다. 나는. 이 맵 (청색 활성, 비활성 회색) 유효 : I 맵 필드가 2 차원 배열을2 차원 배열의 연결된 이웃을 확인하는 알고리즘

enter image description here

. 각 필드는 활성인지 여부를 정의하는 boolean 값을가집니다. 각 필드에 직접 활성 이웃 필드가 (정확히 1 활성 필드 또는 1 개 이상의 활성 필드 중 하나가 있습니다) 경우

private bool IsMapPlayable() 
{ 
    int numberOfActiveFields = 0; 
    for (var row = 0; row < this.GameFields.Length; row++) 
    { 
     for (var col = 0; col < this.GameFields[row].Length; col++) 
     { 
      if (!this.GameFields[row][col].IsActive) continue; 
      numberOfActiveFields++; 

      if (!(row > 0 && this.GameFields[row - 1][col].IsActive) 
       && !(row + 1 < this.GameFields.Length && this.GameFields[row + 1][col].IsActive) 
       && !(col > 0 && this.GameFields[row][col - 1].IsActive) 
       && !(col + 1 < this.GameFields[row].Length && this.GameFields[row][col + 1].IsActive) 
       && numberOfActiveFields > 1) 
      { 
       return false; 
      } 
     } 
    } 

    return numberOfActiveFields > 0; 
} 

이 방법 만 검사 :지도가 나는 다음과 같은 방법을 쓴 유효한지 확인하십시오.

enter image description here

enter image description here

그러나이지도는 유효하지 말아야 : 불행하게도이 방법으로, 다음지도는 또한 유효합니다. 지도가 유효한지 확인하는 가장 효율적인 알고리즘은 무엇입니까?

+0

모든 맵은 항상 맨 위 왼쪽 필드를 활성으로 시작합니까? –

+0

아니요, 원하는대로지도를 정의 할 수 있습니다. 그래서 그것은 또한 필드 [2] [2]와 [2] [3]만을 가질 수 있습니다. –

+0

필드를 두 개 이상의 다른 필드에 연결할 수 있습니까? 예를 들어 [2] [2] [1] [2] [2] [3]에 연결할 수 있습니까? –

답변

1

방법 중 한 쌍 :

가 활성 세포에서 BFS을 실행하고 모든 활성 세포가

사용 union-find data structure 표시되어 있는지 확인 종료 후 (당신이 그런 작은 그리드에 대한 최적화를 필요가 없습니다), 활성 삽입 활성 이웃이있는 셀을 확인하고 연결된 구성 요소가 하나만 있는지 확인하십시오.

+0

BFS는 제가 찾고 있던 것입니다. 감사! –