2013-02-12 158 views
1

我目前正在編寫一些代碼來處理棋盤。 Go板被表示爲一系列顏色。該陣列具有size×size條目並且代表二維方形板。快速算法在棋盤上清除棋盤

enum color { 
    EMPTY, 
    BLACK, 
    WHITE, 
}; 

struct go_board { 
    unsigned int size; 
    enum color intersections[]; 
}; 

enum color player移動時,下面的過程適用:(參見rules

  1. [...]
  2. 的點P,不着色C,被認爲達到C,如果有是P的顏色從P點到C點的(垂直或水平方向)相鄰點的路徑。
  3. 清除顏色是清空顏色中未達到空白的所有點的過程。
  4. [...]
  5. 移動包括清除對方顏色,然後清除自己的顏色。

我正在尋找一種快速(在計算複雜性和實際速度方面)算法來清除板子。你可以幫我嗎?

+3

已經測量你的「慢」的方法,並確定它是在應用程序中的瓶頸?首先:使其正確工作;不要擔心表演。 – pmg 2013-02-12 11:03:35

+0

@pmg我想到的「慢」的方法非常不好,我還沒有測試過。計算複雜度爲O(n4),其中n是板的大小。 – fuz 2013-02-12 11:05:03

+0

19^4是*僅* 130321 – pmg 2013-02-12 11:06:33

回答

3

使用圖像處理的填充算法。首先,用空點填充所有白色或空白的位置;所有未填充白石的位置都將死亡。用黑色重複。

+0

這似乎是一個O(n²)算法,看起來相當不錯。我會看看這個。謝謝! – fuz 2013-02-12 11:10:30

+0

這可以工作,但我不得不承認我不知道我明白。它可能行不通:在Go中,有些羣體無條件地活着(2個或更多的眼睛,或者相互連接的羣體之間有幾個假眼睛),還有一些羣體是「相互依存」的(seki,...)。我不確定這可以簡單地回到一個簡單的填充算法。 – 2013-02-13 09:32:46

+0

@Olivier我只問一些因爲他們沒有自由而被刪除的團體。我的用例中不需要更多計算。 – fuz 2013-03-13 17:40:41

0

您可以保留對電路板上每個組的參考,並跟蹤他們的自由。對於每個添加的寶石,您最多隻需合併/更新4個組。是我還是這聽起來像O(K)?:)

(編輯)

+0

這對我有什麼幫助? Go板不完全稀疏。 – fuz 2014-03-27 20:10:42

+0

的確,我回答得太快orz讓我編輯我的答案。 – okw 2014-03-28 04:54:12