Dla mojego zadania C++, zasadniczo próbuję przeszukać fragment tekstu w pliku tekstowym (który jest przesyłany strumieniowo do mojego wektora vec
) rozpoczynając od druga górna postać po lewej. To jest dla labiryntu tekstowego, w którym mój program ma na końcu wydrukować znaki dla ścieżki przez niego.Algorytmy do drukowania ścieżek ekranowych za pośrednictwem labiryntu tekstowego
Przykładem labiryntu byłoby jak:
###############
Sbcde####efebyj
####hijk#m#####
#######lmi#####
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
###############
Gdzie „#” jest unwalkable ścian i zawsze rozpoczyna się w lewo na drugim górnym znaku. Znaki alfabetyczne oznaczają kwadraty, które można przechodzić. Zjazd (y) są ZAWSZE po prawej stronie. Labirynt ma zawsze rozmiar 15x15 w pliku labiryntu. Znaki alfabetyczne powtarzają się w tym samym labiryncie, ale nie bezpośrednio obok siebie.
Co staram się tutaj zrobić, to: jeśli kwadrat obok bieżącego ma alfabetyczną postać, dodaj go do wektora vec
i powtarzaj ten proces, aż dojdę do końca labiryntu. Ostatecznie mam zrobić to bardziej skomplikowanym, drukując na ekranie wiele ścieżek, które istnieją w niektórych labiryntach.
tej pory mam to dla samego algorytmu, co wiem, to źle:
void pathcheck()
{
if (isalpha(vec.at(x)) && !(find(visited.begin(), visited.end(), (vec.at(x))) != visited.end()))
{
path.push_back(vec.at(x));
visited.push_back(vec.at(x));
pathcheck(vec.at(x++));
pathcheck(vec.at(x--));
pathcheck(vec.at(x + 16));
pathcheck(vec.at(x - 16));
}
}
visited
jest moje utrzymanie wektor utwór z odwiedzanych kwadratów.
Jak mogę to zaktualizować, aby faktycznie działało, i ostatecznie, aby móc zarządzać więcej niż jedną ścieżką (np. Gdyby były 2 ścieżki, program wydrukowałby na obu ekranach)? Pamiętam, jak mówiono mi, że mogę potrzebować innego wektora/tablicy, który śledzi kwadraty, które już odwiedziłem/sprawdziłem, ale w jaki sposób mogę to dokładnie tutaj zaimplementować?
Musisz pamiętać, gdzie byłeś, więc nie sprawdzasz go ponownie. W przeciwnym razie byłbyś krok naprzód o krok do przodu i nikt nie posuwał się tak daleko ... –
Zaktualizowano. Ale wiem, że mój vec.at w rekursywnych wywołaniach jest zły ... co powinienem powiedzieć? – forthewinwin
Czy sprawdzasz również, czy nie wychodzisz poza obszar labiryntu 15x15? –