Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Mapa, wspolrzedne, obliczanie sciezki
Revan
post 26.05.2005, 18:25:42
Post #1





Grupa: Zarejestrowani
Postów: 49
Pomógł: 0
Dołączył: 21.03.2004
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Jo!
Mam taka mape, ktora jest podzielona na kwadraty:
Kod
|--1--|--2--|--3--|--4--|--5--|
1     |     |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
2     |     |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
3     |     |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
4     |     |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
5     |     |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|

Teraz, zalozmy ze chce przejsc z kwadratu 2,2 (p) do 4,5 (k) z tym ze pola oznaczone x sa nie do przejscia. Tak jak tu:
Kod
|--1--|--2--|--3--|--4--|--5--|
1     |     |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
2     |  p  |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
3     |     |  x  |  x  |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
4     |     |     |     |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|
5     |     |     |  k  |     |
|     |     |     |     |     |
|-----|-----|-----|-----|-----|

Pomyslalem zeby zrobic petle. Kazda iteracja petli to jeden ruch. Przewiduje mozliwosc na skos. No i w kazdej sytuacji najprostrza droga bedzie wlasnie na ukos. No i zeby tak przejsc musimy przejsc przez pola 2,3 , 3,3 , 3,4 i 4,4. Na poczatek zastanawiam sie czy w ogole jest to mozliwe do obliczenia przez php. No, ale dajmy na to ze tak. Pierwsza iteracja - sprawdzamy czy mozemy wejsc na pole 2,3. Jezeli tak - idziemy do drugiej iteracji, jezeli nie - sprawdzamy czy sasiednie pola (zaczynajac od tych najblizej punktu docelowego) sa puste. Jezeli mozna wejsc na jakies pole, wchodzimy na nie, konczymy petle i wchodzimy do nowej, gdzie nastepuje ponowne liczenie sciezki, ale juz od nowego pukntu.
Dobrze mysle, i czy da to sie wykonac? Potrafil bym napisac takie cos, ale nie uwzgledniajac chodzenia na skos. Prosze o jakies sugestie, jak to rozwiazac.
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
TomASS
post 27.05.2005, 15:16:06
Post #2





Grupa: Zarejestrowani
Postów: 1 660
Pomógł: 13
Dołączył: 9.06.2004
Skąd: Wrocław i okolice

Ostrzeżenie: (0%)
-----


Cytat(Radek)
Widze, ze slabo znacie sie na algorytmach ;-).

Kogo masz na myśli? tongue.gif

Cytat(Radek)
Ktos wspominal algorytm Dijkstry. Tak - moznaby go w tym wypadku uzyc, ale nie ma takiej potrzeby. Dijkstry uzywa sie w przypadku kiedy odleglosci miedzy polami bylyby rozne [wagi krawedzi w grafie o roznych wartosciach].

A kto Ci takich bajek naopowiadał? Niby czemu tutaj go nie można użyć. Fakt, że nie jest zbyt wydajny, ale jest JEDNYM Z MOŻLIWYCH rozwiązań i w sieci można znaleźć bardzo wiele publikaci na jego temat.

Cytat(Radek)
Algorytm do rozwiazania tego problemu jest prosty.

Dla jednych jest, dla innych nie.... tongue.gif

Cytat(Radek)
Implementujesz sobie prosta kolejke FIFO do przechowywania pol [czyli wartosci X i Y]. Nastepnie wsadzasz na stos pole startowe i robisz tak:
1. kolejka jest pusta? -> nie znaleziono drogi, koncz dzialanie skryptu
2. pobierz z kolejki pole P, zaznacz jako przegladniete
3. jesli pole P jest polem koncowym -> znaleziono droge
3. sprawdz kazde pole sasiednie pola P [czyli pola na ktore mozna przejsc] -> jesli nie sa odwiedzone i nie sa oznaczone jako X to wsadz je do kolejki, dla kazdego wsadzanego R pola ustaw jako poprzednik jako P

Dobre, też dobre rozwiązanie, można by nawet powiedzieć, że najlepsze....

Cytat(Radek)
Jest to algorytm przeszukiwania wszerz.
Zlozonosc tego algorytmu to O(N+8N)=O(N), gdzie N to liczba pol na szachownicy.
W momencie dojscia do pola koncowego aby wyznaczyc sciezke po ktorej nalezy sie poruszac robimy to cofajac sie po poprzednikach. Jest to dosc ogolnie opisany algorytm wiec jak masz jakies pytania to pisz, ew. szukaj na googlach "przeszukiwanie grafu wszerz"


No nie koniecznie wszerz, można też wstecz....

Ogólnie, zgadzam się z kolegą Radkiem - poczytaj o grafach, to naprawde poteżne narzędzie i na pewno Ci się przyda w tej sytuacji.


--------------------
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 14.08.2025 - 14:47