[C] Program do grania w Go

0

Witam.

Piszę z prośbą o pomoc w napisaniu algorytmów dla gry Go w języku C.
Moja plansza gry to tablica dwuwymiarowa zawierające współrzędne kamienia na planszy oraz ilość jego oddechów. W sytuacji kiedy jeden kamień jest otoczony przez 4 kamienie koloru przeciwnego sprawa jest prosta. Problemy zaczynają się, gdy obok kamienia stoi inny, tego samego koloru. Wtedy powstaje łańcuch posiadający wspólne oddechy.
Właśnie tutaj zaczynają się moje problemy: jak powinienem obliczać oddechy łańcuchów? Za nic nie potrafię wymyślić odpowiedniego algorytmu...

0

Tablica char z odwiedzonymi (sprawdzonymi) kamieniami i rekurencyjnie szukasz. Oczywiście na tej tablicy zaznaczasz jako odwiedzone i odwiedzone już pomijasz. Jeśli którykolwiek zwróci, że ma wolnego sąsiada, zwraca true po stosie w górę. Możesz wszędzie zwracać 1 i przy sprawdzaniu sąsiadów dodawać oddechy dla danego kamienia.

//W - szerokość
//H - wysokość planszy
//plansza[][] - tablica liczb przechowujących wartość pola: 0-puste, dwie inne - gracze.
char O[W][H];
int sprawdz(int x, int y, int k){
    if(O[x][y]>0 || x<0 || y<0 || x>=W || y>=H) return 0; //poza planszą lub odwiedzony
    O[x][y]=1; //oznacz jako odwiedzony
    if(plansza[x][y]==0) return 1; //puste pole, zwróć 1, jako że to jest oddech
    if(plansza[x][y]!=k) return 0; //pole przeciwnika, puste pole wzięte pod uwagę wcześniej; zwraca brak oddechu
    //Tu mamy już pewność, że to kamień tego samego gracza
    //zwraca więc oddechy sąsiadów
    return sprawdz(x+1,y,k)+sprawdz(x-1,y,k)+sprawdz(x,y+1,k)+sprawdz(x,y-1,k);
}

Tyle że przed każdym sprawdzaniem musisz czyścić tą tablicę. Nieoptymalne, ale można sobie pozwolić na takie marnotrawstwo czasu, skoro sprawdzać ma tylko po wykonanym ruchu

0

Ach, ta rekurencja. Że też sam na to nie wpadłem.

Funkcja bardzo dobrze spełnia swoje zadanie, dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1