Advertisement
hibbzboi

AStar, final release [6x6]

Jun 2nd, 2016
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.07 KB | None | 0 0
  1. // ConsoleApplication1.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6. #include <vector>
  7. #include <fstream>
  8. #include <math.h>
  9. #include <string>
  10. #include <algorithm>
  11.  
  12. using namespace std;
  13.  
  14. class Punkt {
  15. public:
  16.     int x;
  17.     int y;
  18.     double f;
  19.     double g;
  20.     double h;
  21.     Punkt* rodzic;
  22. };
  23.  
  24. int mapa[6][6];
  25.  
  26. Punkt listaWszystkichPunktow[6][6];
  27.  
  28. double MetrykaEuklidesowa(Punkt* pierwszy, Punkt* drugi) {
  29.  
  30.     double czynnik1 = (pierwszy->x - drugi->x)*(pierwszy->x - drugi->x);
  31.     double czynnik2 = (pierwszy->y - drugi->y)*(pierwszy->y - drugi->y);
  32.  
  33.     double h = sqrt(czynnik1 + czynnik2);
  34.  
  35.     return h;
  36. }
  37.  
  38. Punkt Poszukiwany(vector<Punkt> lista, Punkt poszukiwany) {
  39.  
  40.     Punkt zListy = lista.front();
  41.  
  42.     for (int i = 0; i < lista.size(); i++)
  43.     {
  44.         if (lista[i].x == poszukiwany.x && lista[i].y == poszukiwany.y)
  45.         {
  46.             zListy = poszukiwany;
  47.         }
  48.     }
  49.    
  50.     return zListy;
  51. }
  52.  
  53. vector<Punkt> GenerowanieDzieci(Punkt* punkt) {
  54.  
  55.     vector<Punkt> listaDzieci;
  56.  
  57.     if (punkt->y + 1 < 6)
  58.     {
  59.         Punkt gora;
  60.         gora.x = punkt->x;
  61.         gora.y = punkt->y + 1;
  62.         gora.rodzic = punkt;
  63.         if (mapa[gora.y][5-gora.x] == 0)
  64.         {
  65.             listaDzieci.push_back(gora);
  66.         }
  67.     }
  68.  
  69.     if (punkt->y - 1 >= 0)
  70.     {
  71.         Punkt dol;
  72.         dol.x = punkt->x;
  73.         dol.y = punkt->y - 1;
  74.         dol.rodzic = punkt;
  75.         if (mapa[dol.y][5-dol.x] == 0)
  76.         {
  77.             listaDzieci.push_back(dol);
  78.         }
  79.     }
  80.  
  81.     if (punkt->x - 1 >= 0)
  82.     {
  83.         Punkt lewy;
  84.         lewy.x = punkt->x - 1;
  85.         lewy.y = punkt->y;
  86.         lewy.rodzic = punkt;
  87.         if (mapa[lewy.y][5-lewy.x] == 0)
  88.         {
  89.             listaDzieci.push_back(lewy);
  90.         }
  91.     }
  92.  
  93.     if (punkt->x + 1 < 6)
  94.     {
  95.         Punkt prawy;
  96.         prawy.x = punkt->x + 1;
  97.         prawy.y = punkt->y;
  98.         prawy.rodzic = punkt;
  99.         if (mapa[prawy.y][5 - prawy.x] == 0)
  100.         {
  101.             listaDzieci.push_back(prawy);
  102.         }
  103.     }
  104.  
  105.     return listaDzieci;
  106.  
  107. }
  108.  
  109. vector<Punkt*> AStar(Punkt* start, Punkt* stop) {
  110.  
  111.     vector<Punkt*> listaOtwarta;
  112.     vector<Punkt*> listaZamknieta;
  113.  
  114.     listaOtwarta.push_back(start);
  115.     listaWszystkichPunktow[start->x][start->y].x = start->x;
  116.     listaWszystkichPunktow[start->x][start->y].y = start->y;
  117.     listaWszystkichPunktow[start->x][start->y].g = start->g;
  118.     listaWszystkichPunktow[start->x][start->y].h = start->h;
  119.     listaWszystkichPunktow[start->x][start->y].f = start->f;
  120.     listaWszystkichPunktow[start->x][start->y].rodzic = start->rodzic;
  121.  
  122.     while (listaOtwarta.size() > 0)
  123.     {
  124.         Punkt* q = listaOtwarta.front();
  125.  
  126.         for (int i = 0; i < listaOtwarta.size(); i++) {
  127.             if (listaOtwarta[i]->f <= q->f)
  128.             {
  129.                 q = listaOtwarta[i];
  130.             }
  131.         }
  132.  
  133.         listaOtwarta.erase(remove(listaOtwarta.begin(), listaOtwarta.end(), q), listaOtwarta.end());
  134.  
  135.         vector<Punkt> dzieci = GenerowanieDzieci(q);
  136.  
  137.         for (int i = 0; i < dzieci.size(); i++) {
  138.  
  139.             if (dzieci[i].x == stop->x && dzieci[i].y == stop->y) {
  140.                 listaZamknieta.push_back(q);
  141.                 listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].rodzic = dzieci[i].rodzic;
  142.                 stop->rodzic = listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].rodzic;
  143.                 listaZamknieta.push_back(stop);
  144.                 goto skok2;
  145.             }
  146.  
  147.             dzieci[i].g = q->g + 1;
  148.             dzieci[i].h = MetrykaEuklidesowa(&dzieci[i], stop);
  149.             dzieci[i].f = dzieci[i].g + dzieci[i].h;
  150.  
  151.             for (int j = 0; j < listaOtwarta.size(); j++) {
  152.  
  153.                 if (listaOtwarta[j]->x == dzieci[i].x && listaOtwarta[j]->y == dzieci[i].y && listaOtwarta[j]->f < dzieci[i].f) {
  154.                     goto skok;
  155.                 }
  156.             }
  157.  
  158.             for (int j = 0; j < listaZamknieta.size(); j++) {
  159.  
  160.                 if (listaZamknieta[j]->x == dzieci[i].x && listaZamknieta[j]->y == dzieci[i].y && listaZamknieta[j]->f < dzieci[i].f) {
  161.                     goto skok;
  162.                 }
  163.             }
  164.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].x = dzieci[i].x;
  165.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].y = dzieci[i].y;
  166.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].f = dzieci[i].f;
  167.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].g = dzieci[i].g;
  168.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].h = dzieci[i].h;
  169.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].rodzic = dzieci[i].rodzic;
  170.             listaOtwarta.push_back(&listaWszystkichPunktow[dzieci[i].x][dzieci[i].y]);
  171.         skok:;
  172.         }
  173.         listaZamknieta.push_back(q);
  174.     }skok2:;
  175.  
  176.     return listaZamknieta;
  177. }
  178.  
  179. vector<Punkt> OdwracanieKolejnosci(vector<Punkt> wektor) {
  180.     std::reverse(wektor.begin(), wektor.end());
  181.     return wektor;
  182. }
  183.  
  184. int main(int argc, char** argv) {
  185.  
  186.     cout << "Prezentacja algorytmu A* - Kacper Jankowski, 2016\n";
  187.  
  188.     string nazwap = "grid.txt";
  189.     int wym2 = 6;
  190.     int wym1 = 6;
  191.  
  192.     //teraz deklarujemy dynamicznie tablice do, której wczytamyu nasz plik,
  193.     int rows = wym2 + 1;
  194.     double **G;
  195.     G = new double*[rows];
  196.     while (rows--) G[rows] = new double[wym1 + 1];
  197.  
  198.     cout << "\nNacisnij ENTER aby wczytac tablice o nazwie " << nazwap << "\n";
  199.     getchar();
  200.  
  201.     cout << "\nWczytana mapa:\n\n";
  202.  
  203.     std::ifstream plik(nazwap.c_str());
  204.  
  205.     for (unsigned int i = 0; i<wym2; i++)
  206.     {
  207.         for (unsigned int j = 0; j<wym1; j++)
  208.         {
  209.             plik >> G[i][j];
  210.         }
  211.     }
  212.     plik.close();
  213.  
  214.     for (unsigned int i = 0; i<wym2; i++)
  215.     {
  216.         for (unsigned int j = 0; j<wym1; j++)
  217.         {
  218.             int liczba;
  219.             liczba = G[i][j];
  220.             mapa[i][j] = liczba;
  221.         }
  222.     }
  223.  
  224.     for (int i = 0; i<wym2; i++)
  225.     {
  226.         for (int j = 0; j<wym1; j++)
  227.         {
  228.             cout << " " << mapa[i][j];
  229.         }cout << "\n";
  230.     }
  231.  
  232.     Punkt startowy;
  233.     startowy.x = 1;
  234.     startowy.y = 3;
  235.     startowy.g = 0;
  236.  
  237.     Punkt cel;
  238.     cel.x = 5;
  239.     cel.y = 4;
  240.  
  241.     cout << "\nPrzyjety punkt startowy: (" << startowy.x << "," << startowy.y << ")\n";
  242.     cout << "Przyjety punkt koncowy: (" << cel.x << "," << cel.y << ")";
  243.  
  244.     cout << "\n\nNacisnij ENTER aby wygenerowac sciezke przy pomocy algorytmu A*";
  245.     getchar();
  246.  
  247.     vector<Punkt*> witam = AStar(&startowy, &cel);
  248.  
  249.     Punkt* start = &startowy;
  250.  
  251.     Punkt* poszukiwany = &cel;
  252.  
  253.     vector<Punkt> sciezka;
  254.  
  255.     sciezka.push_back(cel);
  256.  
  257.     do
  258.     {
  259.         for (int i = 0; i < witam.size(); i++)
  260.         {
  261.             if (poszukiwany->x == start->x && poszukiwany->y == start->y)
  262.             {
  263.                 goto skok3;
  264.             }
  265.  
  266.             if (witam[i]->x == poszukiwany->rodzic->x && witam[i]->y == poszukiwany->rodzic->y)
  267.             {
  268.                 poszukiwany = &listaWszystkichPunktow[witam[i]->x][witam[i]->y];
  269.  
  270.                 Punkt doDodania;
  271.                 doDodania.x = poszukiwany->x;
  272.                 doDodania.y = poszukiwany->y;
  273.                 sciezka.push_back(doDodania);
  274.                 i = witam.size();
  275.             }
  276.         }
  277.     } while (poszukiwany != start);
  278. skok3:;
  279.  
  280.     vector<Punkt> sciezkaUporzadkowana = OdwracanieKolejnosci(sciezka);
  281.  
  282.     cout << "\n\nMapa z zaznaczona sciezka:\n\n";
  283.  
  284.     for (int i = 0; i < sciezkaUporzadkowana.size(); i++)
  285.     {
  286.         mapa[5 - sciezkaUporzadkowana[i].y][sciezkaUporzadkowana[i].x] = 1;
  287.     }
  288.  
  289.     for (int i = 0; i<wym2; i++)
  290.     {
  291.         for (int j = 0; j<wym1; j++)
  292.         {
  293.             cout << " " << mapa[i][j];
  294.         }cout << "\n";
  295.     }
  296.  
  297.     cout << "\nPunkty na sciezce:\n";
  298.  
  299.     for (int i = 0; i < sciezkaUporzadkowana.size(); i++)
  300.     {
  301.         cout << "(" << sciezkaUporzadkowana[i].x << "," << sciezkaUporzadkowana[i].y << ") ";
  302.     }
  303.  
  304.     //na koniec czyscimy pamiec po naszej tablicy
  305.     for (int i = 0; i<wym2 + 1; i++)
  306.     {
  307.         delete[] G[i];
  308.     }//czyscimy wiersze
  309.     delete[] G;//zwalniamy tablice wskaznikow do wierszy
  310.  
  311.     cout << "\n\nNacisnij ENTER aby zakonczyc";
  312.     getchar();
  313.  
  314.     return 0;
  315.  
  316.    
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement