Mam do czynienia z problemem w moim projekcie Go Game.Wyszukiwanie 'bąbelków' w tablicy 2D znaków w Javie
Mam deskę (goban) reprezentowaną przez 2D Array of charars. Przed każdym następnym ruchem chciałbym sprawdzić "bańki" w tablicy. Bubble powinien być 4-połączonym obszarem identycznych znaków otoczonych w 4 kierunkach przez inną grupę konkretnych identycznych znaków. Jeśli ta "bańka" istnieje, postacie wewnątrz powinny zostać zastąpione przez inne. Ale może być więcej obszarów i nie wszystkie są zamknięte. Na przykład, mam ten dział:
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 | + + + + + + + + + + + + + |
- - - - - - - - - - - - - - -
I chciałbym, aby znaleźć bańki xs, policzyć je i zastąpić je „Z tych.
Mam googleed i myślę, że niektóre algorytm etykietowania Connected-component lub FloodFill może wykonać zadanie, ale nie jestem pewien, jak go wdrożyć. Czy w ten sposób lub coś mniej skomplikowanego może go rozwiązać? Dziękujemy
Edytuj: Próbowałem znaleźć wzór, który mógłby znaleźć obszary określonego charakteru i policzyć ich wolności, ale zawsze zawodził, gdy lokalizacja była wielowarstwowa. Zmiana struktury danych może być rozwiązaniem, ale jeśli to możliwe, chciałbym to zrobić tak jak teraz.
Mój obecny pomysł rozwiązanie:
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
}
Czy za innych struktur danych? Być może mógłbyś mieć klasę Łańcuchową, która zawiera wszystkie połączone płytki tego samego koloru. Miałoby to pewną liczbę swobód, a łańcuch zostałby usunięty, gdy swoboda osiągnie 0. –
Będzie świetnie, jeśli zamieścisz także "pożądany wynik". – Bhushan
Dziękuję wam, zaktualizowałem opis – jC30