Zmniejszenie rozmiaru i przyspieszenie programu

0

Witam.
Mam program obliczający najkrótszą ścieżkę pomiędzy 2 punktami w labiryncie zbudowanego z tablicy 20x20. Wszystko działa sprawnie, lecz mi zależy na tablicy dużo większych rozmiarów. Każda komórka w tablicy ma własną strukturę, więc dla tablicy np. 200x200 wychodzi 40000 struktur. To chyba dużo ;). Poza tym znacznie spada czas po jakim widać ścieżkę.

miałem dodać kod źródłowy programu, ale występują mi błędy w dodaniu... czy to znaczy, że kod jest za długi? [ok. 200 linii]
Kod jest w pliku tekstowym.

P.S. Drogę znajduję dzięki algorytmowi BFS

0

Na dobry początek proponuję:

  • popraw ustawianie_punktu_startu, stworz_punkt_w_prawo, stworz_punkt_w_lewo, stworz_punkt_w_dol, stworz_punkt_w_gore w taki sposób, żeby zawsze był wykonywany return

  • w instrukcjach for wykorzystuj stałe, np.

for(int id=0; id<399; id++)

zastosuj stałą zamiast 399

  • tak samo w deklaracjach tablic:
char map[20][20] = {
struct punkt p[400];
  • udowodnij, że wyznaczenie_trasy nie może się zawiesić. Jeśli formalny dowód nie istnieje dodaj odpowiednie warunki.

  • dlaczego stworz_punkt_w_gore wykorzystuje 399 a stworz_punkt_w_dol wartość 400 w pętli for?

  • 666 też powinno być stałą > od stałej w deklaracji p[400]

0

Nie jest źle jak na początek.
Poza dobrymi radami powyżej, zwróć uwagę, że stworz_punkt_w_x wyglądają w zasadzie tak samo.
Na dodatek nie zauważyłeś, że struct punkt p[400]; to w zasadzie stos, więc spokojnie można było dodać zmienną wskazująca na szczyt stosu i wtedy przeszukiwanie wolnego miejsca jest zbędne i jedno pole struktury też jest zbędne
Ja bym to napisał raczej tak:

int stworz_punkt(int naPodstawie, ind dx, int dy)
{
    assert(dx!=0 || dy !=0);
    if (cos_co_wymyslisz)
          return 0;
    p[p_count].x = p[naPodstawie].x+dx;
    p[p_count].y = p[naPodstawie].y+dy;
    p[p_count].poprzedni = naPodstawie;
    p[p_count].dlugosc = p[naPodstawie].dlugosc+1;
    map[p[p_count].y][p[p_count].x] = '2';
    return ++p_count;
}
0

dzięki wielkie :)
jak wrócę do domu ogarnę to.

Aaaa...
"- udowodnij, że wyznaczenie_trasy nie może się zawiesić. Jeśli formalny dowód nie istnieje dodaj odpowiednie warunki."
wyznaczanie trasy się nie zawiesi, gdyż:

  • jest odpowiednia ilość struktur;
  • gdy żaden punkt nie ma drogi dezaktywuje się, a gdy wszystkie są dezaktywowane wtedy return zwraca "nie ma wyjścia".

I czym się różni stała=123 niż zwykłe 123? Przecież w gruncie rzeczy to też jest stała :)

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