2014-03-01 43 views
3

對於遊戲(WPF),我需要創建一個地圖編輯器。地圖由4x3地圖字段的矩陣定義。當用戶編輯地圖時,他可以啓用和禁用每個字段,用他定義地圖的外觀。現在,只有每個字段都連接到另一個字段,地圖纔是有效的。即此映射是有效的(藍色是活動的,不活動的灰色):檢查二維數組中連接的鄰居的算法

enter image description here

我與地圖字段的二維數組。每個字段都有一個boolean值,它定義它是否處於活動狀態。要檢查是否地圖是有效的,我寫了下面的方法:

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

此方法僅檢查每個字段有直接的積極的鄰居場(並且已完全1活躍的領域或超過1個活躍的領域)。不幸的是用這種方法,下面的地圖也有效:

enter image description here

enter image description here

但這些地圖不應該是有效的。什麼是檢查地圖是否有效的最有效的算法?

+0

是否每個地圖始終以左上角字段開始,並且處於活動狀態? –

+0

不,您可以根據需要定義地圖。所以它也可能只有字段[2] [2]和[2] [3]有效。 –

+0

一個字段可以連接到兩個以上的其他字段。例如,可以將[2] [2]連接到[1] [2],[2] [1]和[2] [3]? –

回答

1

一對方法:

從任何活動單元格執行BFS,並結束檢查所有活性細胞被標記

使用union-find data structure後(你不需要這樣的小格子中的任何優化),插入活躍具有活動鄰居的單元格,並檢查是否只有一個連接組件

+0

BFS正是我所期待的。謝謝! –