hibbzboi

A*

Jun 1st, 2016
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.87 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[20][20];
  25.  
  26. Punkt listaWszystkichPunktow[20][20];
  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.  
  39. Punkt Poszukiwany(vector<Punkt> lista, Punkt poszukiwany) {
  40.  
  41.     Punkt zListy = lista.front();
  42.  
  43.     for (int i = 0; i < lista.size(); i++)
  44.     {
  45.         if (lista[i].x == poszukiwany.x && lista[i].y == poszukiwany.y)
  46.         {
  47.             zListy = poszukiwany;
  48.         }
  49.     }
  50.    
  51.     return zListy;
  52. }
  53.  
  54. vector<Punkt> GenerowanieDzieci(Punkt* punkt) {
  55.  
  56.     vector<Punkt> listaDzieci;
  57.  
  58.     if (punkt->y + 1 < 20)
  59.     {
  60.         Punkt gora;
  61.         gora.x = punkt->x;
  62.         gora.y = punkt->y + 1;
  63.         gora.rodzic = punkt;
  64.         if (mapa[gora.x][gora.y] == 0)
  65.         {
  66.             listaDzieci.push_back(gora);
  67.         }
  68.     }
  69.  
  70.     if (punkt->y - 1 >= 0)
  71.     {
  72.         Punkt dol;
  73.         dol.x = punkt->x;
  74.         dol.y = punkt->y - 1;
  75.         dol.rodzic = punkt;
  76.         if (mapa[dol.x][dol.y] == 0)
  77.         {
  78.             listaDzieci.push_back(dol);
  79.         }
  80.     }
  81.  
  82.     if (punkt->x - 1 >= 0)
  83.     {
  84.         Punkt lewy;
  85.         lewy.x = punkt->x - 1;
  86.         lewy.y = punkt->y;
  87.         lewy.rodzic = punkt;
  88.         if (mapa[lewy.x][lewy.y] == 0)
  89.         {
  90.             listaDzieci.push_back(lewy);
  91.         }
  92.     }
  93.  
  94.     if (punkt->x + 1 < 20)
  95.     {
  96.         Punkt prawy;
  97.         prawy.x = punkt->x + 1;
  98.         prawy.y = punkt->y;
  99.         prawy.rodzic = punkt;
  100.         if (mapa[prawy.x][prawy.y] == 0)
  101.         {
  102.             listaDzieci.push_back(prawy);
  103.         }
  104.     }
  105.  
  106.     return listaDzieci;
  107.  
  108. }
  109.  
  110. vector<Punkt*> AStar(Punkt* start, Punkt* stop) {
  111.  
  112.     vector<Punkt*> listaOtwarta;
  113.     vector<Punkt*> listaZamknieta;
  114.  
  115.     listaOtwarta.push_back(start);
  116.  
  117.     while (listaOtwarta.size() > 0)
  118.     {
  119.         Punkt* q = listaOtwarta.front();
  120.  
  121.         for (int i = 0; i < listaOtwarta.size(); i++) {
  122.             if (listaOtwarta[i]->f < q->f)
  123.             {
  124.                 q = listaOtwarta[i];
  125.             }
  126.         }
  127.  
  128.         listaOtwarta.erase(remove(listaOtwarta.begin(), listaOtwarta.end(), q), listaOtwarta.end());
  129.  
  130.         vector<Punkt> dzieci = GenerowanieDzieci(q);
  131.  
  132.         for (int i = 0; i < dzieci.size(); i++) {
  133.  
  134.             if (dzieci[i].x == stop->x && dzieci[i].y == stop->y) {
  135.                 break;
  136.             }
  137.  
  138.             dzieci[i].g = q->g + 1;
  139.             dzieci[i].h = MetrykaEuklidesowa(&dzieci[i], stop);
  140.             dzieci[i].f = dzieci[i].g + dzieci[i].h;
  141.  
  142.             for (int j = 0; j < listaOtwarta.size(); j++) {
  143.  
  144.                 if (listaOtwarta[j]->x == dzieci[i].x && listaOtwarta[j]->y == dzieci[i].y && listaOtwarta[j]->f < dzieci[i].f) {
  145.                     goto skok;
  146.                 }
  147.             }
  148.  
  149.             for (int j = 0; j < listaZamknieta.size(); j++) {
  150.  
  151.                 if (listaZamknieta[j]->x == dzieci[i].x && listaZamknieta[j]->y == dzieci[i].y && listaZamknieta[j]->f < dzieci[i].f) {
  152.                     goto skok;
  153.                 }
  154.             }
  155.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].x = dzieci[i].x;
  156.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].y = dzieci[i].y;
  157.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].f = dzieci[i].f;
  158.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].g = dzieci[i].g;
  159.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].h = dzieci[i].h;
  160.             listaWszystkichPunktow[dzieci[i].x][dzieci[i].y].rodzic = dzieci[i].rodzic;
  161.             listaOtwarta.push_back(&listaWszystkichPunktow[dzieci[i].x][dzieci[i].y]);
  162.         skok:;
  163.         }
  164.         listaZamknieta.push_back(q);
  165.     }
  166.  
  167.     return listaZamknieta;
  168. }
  169.  
  170. int main(int argc, char** argv) {
  171.  
  172.     cout << "Wczytywanie danych z pliku\n";
  173.  
  174.     string nazwap = "grid.txt";
  175.     int wym2 = 20;
  176.     int wym1 = 20;
  177.  
  178.     //teraz deklarujemy dynamicznie tablice do, której wczytamyu nasz plik,
  179.     int rows = wym2 + 1;
  180.     double **G;
  181.     G = new double*[rows];
  182.     while (rows--) G[rows] = new double[wym1 + 1];
  183.  
  184.     cout << "\n\nNacisnij ENTER aby wczytac tablice o nazwie " << nazwap;
  185.     getchar();
  186.  
  187.     std::ifstream plik(nazwap.c_str());
  188.  
  189.     for (unsigned int i = 0; i<wym2; i++)
  190.     {
  191.         for (unsigned int j = 0; j<wym1; j++)
  192.         {
  193.             plik >> G[i][j];
  194.         }
  195.     }
  196.     plik.close();
  197.  
  198.     for (unsigned int i = 0; i<wym2; i++)
  199.     {
  200.         for (unsigned int j = 0; j<wym1; j++)
  201.         {
  202.             int liczba;
  203.             liczba = G[i][j];
  204.             mapa[i][j] = liczba;
  205.         }
  206.     }
  207.  
  208.     //for (int i = 1; i < wym2 + 1; i++)
  209.     //{
  210.     //  for (int j = 0; j < wym1 + 1; j++)
  211.     //  {
  212.     //      mapa[i][j] = G[i][j];
  213.     //  }
  214.     //}
  215.  
  216.     Punkt startowy;
  217.     startowy.x = 0;
  218.     startowy.y = 0;
  219.     startowy.g = 0;
  220.  
  221.     Punkt cel;
  222.     cel.x = 19;
  223.     cel.y = 19;
  224.  
  225.     vector<Punkt*> witam = AStar(&startowy, &cel);
  226.  
  227.     int papaj = 2137;
  228.  
  229.  
  230.     //na koniec czyscimy pamiec po naszej tablicy
  231.     for (int i = 0; i<wym2 + 1; i++)
  232.     {
  233.         delete[] G[i];
  234.     }//czyscimy wiersze
  235.     delete[] G;//zwalniamy tablice wskaznikow do wierszy
  236.  
  237.     cout << "\n\nNacisnij ENTER aby zakonczyc";
  238.     getchar();
  239.  
  240.     return 0;
  241. }
Add Comment
Please, Sign In to add comment