我正在處理我的Go Game項目中的問題。在Java中尋找二維字符數組中的'氣泡'
我有一個董事會(goban),由二維數組字符表示。在每次下一步之前,我想檢查一下陣列中的「氣泡」。氣泡應該是由4個方向由另一組特定相同字符圍繞的相同字符的4連接區域。 如果存在這個「泡泡」,那麼裏面的字符應該被其他字符替換。但是可能會有更多的區域,而不是所有的區域都被封閉。 例如,我有這樣的主板:
1 2 3 4 5 6 7 8 9 10 11 12 13
- - - - - - - - - - - - - - -
A | + + + + + + + + + + + + + |
B | + + + + + + + + + + + + + |
C | + + + + + + + + + + + + + |
D | + + + + + + + + + + + + + |
E | + + + + + + + + + + + + + |
F | + + O O O O + + + + + + + |
G | + O X X X X O + + + + + + |
H | + + O O X X O + + + + + + |
I | + + + + O X X O + + + + + |
J | + + + + O X O + + + + + + |
K | + + + + + O + + + + + + + |
L | + + + + + + + + + + + + + |
M | + + + + + + + + + + + + + |
- - - - - - - - - - - - - - -
而且我想找到XS的泡沫,數了以「Z的替換它們。
我使用了它,我認爲一些連接組件標籤算法或FloodFill可以完成這項工作,但我不知道如何實現它。這是否可以解決這個問題? 謝謝
編輯: 我試圖找到一些模式,可以找到特定字符的區域並計算其自由度,但它總是失敗時,位置是多層。 更改數據結構可能是解決方案,但如果可能的話,我想按現在的方式來完成。
我目前的解決方案的想法:
public void solve(){
if (boardContainsEnclosedAreas(goban, onMovePlayerStone, oppositePlayerStone){
onMovePlayerScore += countElementsInAreaAndReplaceThem(onMovePlayerStone, 'Z');
}
}
public boolean boardContainsEnclosedAreas(char[][] playingBoard, char searchedChar, char surroundingChar){
// this method should find the bubble in the playingBoard array
}
public int countElementsInAreaAndReplaceThem(char searchedChar, char replacingChar){
// the method should go through the bubble and replace all inner chars
// returns amount of replaced chars
}
你有沒有考慮過其他的數據結構?也許你可以有一個Chain類,它包含了所有相同顏色的連接圖塊。它會有一些自由度,當自由度達到0時鏈條就會被移除。 –
如果你發佈了'期望的輸出',那麼它會很棒。 – Bhushan
謝謝你們,我已經更新了描述 – jC30