Advertisement
Guest User

Untitled

a guest
Jan 19th, 2019
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.33 KB | None | 0 0
  1. #include "pch.h"
  2. #include <iostream>
  3. #include <fstream>
  4. #include <cstdlib>
  5. #include <cmath>
  6. #include <math.h>
  7. #include <iomanip>
  8.  
  9.  
  10. const int wym = 20;
  11. using namespace std;
  12.  
  13. struct n_p {
  14. int x, y;
  15. }npoz;
  16.  
  17. //funkcja sprawdza mozliwy ruch po wczytanej tablicy od wskazanych wsp.
  18. bool possible_motion(int x, int y, double **Tablica, double **TO, double**TR) {
  19. int poz_x = x;
  20. int poz_y = y;
  21. int end_x = 19, end_y = 19;
  22. double heurystyka =0;
  23. int kosztRuchu = 1; //x + y;
  24. double **Tablica1 = Tablica;
  25. double **Otwarta=TO;
  26. double **Rodzic = TR;
  27. Rodzic[poz_x][poz_y] = 3;
  28.  
  29.  
  30. if (poz_x - 1 >= 0) {
  31. if (Tablica1[poz_x - 1][poz_y] == 0 && Tablica1[poz_x - 1][poz_y] != 5 && Otwarta[poz_x-1][poz_y ] == 0) { //sprawdz DO GÓRY
  32. heurystyka = kosztRuchu + sqrt((pow((poz_x - 1 - end_x), 2) + (pow((poz_y - end_y), 2))));
  33. Otwarta[poz_x - 1][poz_y] = heurystyka;
  34. }
  35. }
  36. if (poz_x + 1 < wym) {
  37. if (Tablica1[poz_x + 1][poz_y] == 0 && Tablica1[poz_x + 1][poz_y] != 5 && Otwarta[poz_x+1][poz_y ] == 0) { //sprawdz DO DOŁU
  38. heurystyka = kosztRuchu + sqrt((pow((poz_x + 1 - end_x), 2) + (pow((poz_y - end_y), 2))));
  39. Otwarta[poz_x + 1][poz_y] = heurystyka;
  40. }
  41. }
  42. if (poz_y - 1 >= 0) {
  43. if (Tablica1[poz_x][poz_y - 1] == 0 && Tablica1[poz_x][poz_y - 1] != 5 && Otwarta[poz_x][poz_y - 1] == 0) { //sprawdz W LEWO
  44. heurystyka = kosztRuchu + sqrt((pow((poz_x - end_x), 2) + (pow((poz_y - 1 - end_y), 2))));
  45. Otwarta[poz_x][poz_y - 1] = heurystyka;
  46. }
  47. }
  48. if (poz_y + 1 < wym) {
  49. if (Tablica1[poz_x][poz_y + 1] == 0 && Tablica1[poz_x][poz_y + 1] != 5 && Otwarta[poz_x][poz_y + 1] == 0) { //sprawdz W PRAWO
  50. heurystyka = kosztRuchu + sqrt((pow((poz_x - end_x), 2) + (pow((poz_y + 1 - end_y), 2))));
  51. Otwarta[poz_x][poz_y + 1] = heurystyka;
  52. }
  53. }
  54. //blokuje, zwracajac false, gdy dalsze wyznaczanie heurystyki niemozliwe
  55. double temp=0;
  56. double temp1 = 0;
  57. if (temp!=heurystyka) {
  58. if (heurystyka != 0) temp = heurystyka;
  59. return true;
  60. }
  61. else{
  62. temp1++;
  63. if (temp1 >=10) return false;
  64. }
  65. return true;
  66. }
  67. //funkcja wyznacza najmniejsza heurystyke pola w tablicy otwartej, oraz wskazuje jej wsp.
  68. void minimum(double **Otwarta, double **Rodzic) {
  69. double **TO = Otwarta;
  70. double **TR = Rodzic;
  71. double min = 40;
  72. int npoz_x=20, npoz_y=20;
  73.  
  74. for (int i = 0; i < wym; i++) {
  75. for (int j = 0; j < wym; j++) {
  76. if (min > TO[i][j] && TO[i][j] != 0 && TR[i][j] != 3) {
  77. min = TO[i][j];
  78. npoz_x = i;
  79. npoz_y = j;
  80. }
  81. }
  82. }
  83. if(npoz_x!=20 ){
  84. npoz.x = npoz_x;
  85. npoz.y = npoz_y;
  86. }
  87. }
  88. //funkcja pobiera tablice rodzica i otwarta, na ich podstawie wyznacza najkrotsza trase do celu
  89. void wyznaczNajkrotsza(double **Otwarta, double **Rodzic, double **Zamknieta) {
  90. double **TO = Otwarta;
  91. double **TZ = Zamknieta;
  92. double **TR = Rodzic;
  93. double max = 0;
  94. double min = 40;
  95.  
  96.  
  97. cout << "TRASA OD CELU DO STARTU:\n";
  98.  
  99.  
  100. for (int i = 19; i >=0; i--) {
  101. for (int j = 19; j >=0; j--) {
  102. if (max < TO[i][j] && TO[i][j] != 0 && TR[i][j] == 3 && TO[i][j] < max + 1.26) {
  103. max = TO[i][j];
  104. TZ[i][j] = 3;
  105. printf("-> (%d,%d) ", i, j);
  106. }
  107. }
  108. }
  109. }
  110.  
  111.  
  112. int main()
  113. {
  114. cout << "Wczytuje tablice z pliku";
  115. string nazwap = "grid.txt";
  116.  
  117. //deklaruje tablice
  118. double **Tablica;
  119. double **TZ;
  120. double **TO;
  121. double **TR;
  122.  
  123.  
  124. Tablica = new double *[wym];
  125. for (int i = 0; i < wym; i++)
  126. Tablica[i] = new double[wym];
  127.  
  128. TZ = new double *[wym];
  129. for (int i = 0; i < wym; i++)
  130. TZ[i] = new double[wym];
  131.  
  132. TO = new double *[wym];
  133. for (int i = 0; i < wym; i++)
  134. TO[i] = new double[wym];
  135.  
  136. TR = new double *[wym];
  137. for (int i = 0; i < wym; i++)
  138. TR[i] = new double[wym];
  139.  
  140. std::ifstream plik(nazwap.c_str());
  141. //przygotowuję pustą tablicę Główną
  142. for (int i = 0; i < wym; i++)
  143. {
  144. for (int j = 0; j < wym; j++)
  145. {
  146. plik >> Tablica[i][j];
  147. }
  148. }
  149. plik.close();
  150.  
  151. //przygotowuję pustą tablicę Zamknieta
  152. for (int i = 0; i < wym; i++)
  153. {
  154. for (int j = 0; j < wym; j++)
  155. {
  156. TZ[i][j] = Tablica[i][j];
  157. }
  158. }
  159. TZ[0][0] = 3;
  160.  
  161. //przygotowuję pustą tablicę Rodzic
  162. for (int i = 0; i < wym; i++)
  163. {
  164. for (int j = 0; j < wym; j++)
  165. {
  166. TR[i][j] = 0;
  167. }
  168. }
  169.  
  170. //przygotowuję pustą tablicę Otwartą
  171. for (int i = 0; i < wym; i++)
  172. {
  173. for (int j = 0; j < wym; j++)
  174. {
  175. TO[i][j] = 0;
  176. }
  177. }
  178. //--------------------------------------------------------------------------------------------------------------------------------
  179.  
  180. cout << "\nWypisujemy na ekran nasza tablice z przeszkodami\n\n";
  181. for (int i = 0; i < wym; i++)
  182. {
  183. for (int j = 0; j < wym; j++)
  184. {
  185. cout << " " << Tablica[i][j];
  186. }cout << "\n";
  187. }
  188. //====================================================================================================================================
  189.  
  190. bool sukces;
  191. sukces=possible_motion(0, 0, Tablica, TO, TR);
  192. minimum(TO,TR);
  193.  
  194. do
  195. {
  196.  
  197. sukces = possible_motion(npoz.x, npoz.y, Tablica, TO, TR);
  198. minimum(TO, TR);
  199. if (sukces == false) break;
  200.  
  201. } while (TR[19][19]==0 );
  202.  
  203.  
  204.  
  205.  
  206. cout << "\nWypisujemy na ekran nasza tablice otwarta\n\n";
  207. for (int i = 0; i < wym; i++)
  208. {
  209. for (int j = 0; j <wym; j++)
  210. {
  211. cout <<" " << setprecision(3) << TO[i][j];
  212. }cout << "\n " /*<< i << " "*/;
  213. }
  214.  
  215. cout << "\nWypisujemy na ekran nasza tablice rodzic\n\n";
  216. for (int i = 0; i < wym; i++)
  217. {
  218. for (int j = 0; j < wym; j++)
  219. {
  220. cout << " " << TR[i][j];
  221. }cout << "\n ";
  222. }
  223.  
  224. wyznaczNajkrotsza(TO, TR, TZ); //<-wyznaczam najkrótszą scieżkę do celu !!!!
  225.  
  226. cout << "\n\nWypisujemy na ekran nasza tablice zamknieta z wyznaczona trasa i przeszkodami\n\n";
  227. for (int i = 0; i < wym; i++)
  228. {
  229. for (int j = 0; j < wym; j++)
  230. {
  231. cout << " " << TZ[i][j];
  232. }cout << "\n ";
  233. }
  234. if (TR[19][19] == 0)cout << "NIE MOZNA DOTRZEC DO CELU";
  235.  
  236. //--------------------------------------------------------------------------------------------------------------------------------
  237. //czyścimy pamięć po naszej tablicy
  238. for (int i = 0; i < wym ; i++)
  239. {
  240. delete[] Tablica[i];
  241. }
  242. delete[] Tablica;
  243.  
  244. for (int i = 0; i < wym; i++)
  245. {
  246. delete[] TZ[i];
  247. }
  248. delete[] TZ;
  249.  
  250. for (int i = 0; i < wym; i++)
  251. {
  252. delete[] TO[i];
  253. }
  254. delete[] TO;
  255.  
  256. for (int i = 0; i < wym; i++)
  257. {
  258. delete[] TR[i];
  259. }
  260. delete[] TR;
  261.  
  262. cout << "\n\nNacisnij ENTER aby zakonczyc";
  263. getchar();
  264.  
  265. return 0;
  266.  
  267. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement