我正在处理我的围棋项目中的问题。
我有一个由字符的二维数组表示的棋盘(goban)。在每次下棋之前,我想检查数组中是否存在“气泡”。气泡应该是由相同字符组成的4连通区域,并被另一组特定相同字符所包围。如果存在这样的“气泡”,则其中的字符应该被替换为其他字符。但可能会有更多的区域,而且并非所有区域都被包围。例如,我有这个棋盘:
我有一个由字符的二维数组表示的棋盘(goban)。在每次下棋之前,我想检查数组中是否存在“气泡”。气泡应该是由相同字符组成的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 | + + + + + + + + + + + + + |
- - - - - - - - - - - - - - -
我希望找到X字符的气泡,计数并用'Z'替换它们。
我已经搜索过了,我认为一些连通组件标记算法或洪水填充可以完成这项工作,但我不确定如何实现它。这是正确的方法还是有更简单的方法可以解决呢? 谢谢
编辑: 我试图找到一些模式,可以找到特定字符区域的位置并计算它们的自由度,但当位置多层时,它总是失败。 改变数据结构可能是解决方案,但如果可能的话,我想保持现状。
我的当前解决方案思路:
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
}