我正在处理我的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