Tengo un problema en mi proyecto Go Game.Buscando 'burbujas' en una matriz 2D de caracteres en Java
Tengo un tablero (goban), representado por una matriz de caracteres 2D. Antes de cada movimiento siguiente, me gustaría comprobar si hay "burbujas" en el conjunto. Bubble debe ser un área con 4 enlaces de caracteres idénticos rodeados en 4 direcciones por otro grupo de caracteres idénticos específicos. Si existe esta 'burbuja', los caracteres internos deberían reemplazarse por otros. Pero podría haber más áreas y no todas están encerradas. Por ejemplo, tengo este tablero:
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 | + + + + + + + + + + + + + |
- - - - - - - - - - - - - - -
y me gustaría encontrar la burbuja de X, contarlos y reemplazarlos con 'Z.
Lo he buscado en Google y creo que algún algoritmo de etiquetado de componentes conectados o FloodFill puede hacer el trabajo, pero no estoy seguro de cómo implementarlo. ¿Es este el camino o algo menos complicado podría resolverlo? Gracias
Editar: He intentado encontrar algún patrón que podría encontrar las áreas de las características específicas y contar sus libertades, pero siempre fracasaron cuando el lugar era de varias capas. Cambiar la estructura de datos podría ser la solución, pero si es posible, me gustaría hacerlo tal como está ahora.
Mi idea solución actual:
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
}
¿Ha considerado otras estructuras de datos? Tal vez podrías tener una clase Chain que contenga todas las fichas conectadas del mismo color. Tendría cierto número de libertades, y la cadena se eliminaría cuando las libertades lleguen a 0. –
Será genial si publica también su 'resultado deseado'. – Bhushan
Gracias chicos, he actualizado la descripción – jC30