Guest User

Untitled

a guest
Jun 17th, 2018
86
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. using namespace std;
  5.  
  6. enum Status { ready, processed, waiting
  7. };
  8.  
  9. enum Typ {droga,sciana,wejscie,wyjscie};
  10. class element {
  11. public:
  12.  
  13. int y;
  14. int x;
  15. Status status;
  16. Typ typ;
  17. int czasDojscia;
  18.  
  19. element (int wspoly,int wspolx,Typ t)
  20. {
  21. status = ready;
  22. x = wspolx;
  23. y = wspoly;
  24.  
  25. typ = t;
  26. czasDojscia = 0;
  27. }
  28.  
  29. };
  30.  
  31. class Kolejka
  32. {
  33. int max;
  34. int poczatek;
  35. int liczbaElementow;
  36. int* tab;
  37. element * labirynt;
  38.  
  39. public:
  40.  
  41. Kolejka(int maksymalnaLiczbaElementow, element * l)
  42. { liczbaElementow = 0;
  43. max=maksymalnaLiczbaElementow;
  44. tab = (int * ) malloc (sizeof(int)*maksymalnaLiczbaElementow);
  45. poczatek = 0;
  46. labirynt = l;
  47. }
  48. void dodaj (int e)
  49. {
  50.  
  51. *(tab+(poczatek+liczbaElementow)%max) = e ;
  52. liczbaElementow++;
  53. (labirynt + e )->status = waiting;
  54.  
  55. }
  56.  
  57. int usun()
  58. {
  59. (labirynt+*(tab+poczatek))->status = processed;
  60. liczbaElementow--;
  61. return *(tab+poczatek++);
  62. }
  63.  
  64. bool pusta()
  65. {
  66. return liczbaElementow==0;
  67. }
  68. ~Kolejka() {free(tab);}
  69. }
  70.  
  71.  
  72. ;
  73.  
  74. bool czyMozna (int x,int y, int n,int m,element * labirynt)
  75. {
  76. if (x>=m || x<0 || y<0 || y>=n) {return false;}
  77. if ((labirynt+y*m + x)->typ==sciana ) { return false;}
  78. if ((labirynt+y*m + x)->status!=ready ) {return false;}
  79.  
  80. return true;
  81. }
  82.  
  83.  
  84. int main()
  85. {
  86. int n,m,numerWejscia,numerWyjscia;
  87. cin>>n>>m;
  88. element * labirynt = (element*) malloc (sizeof(element)*m*n);
  89. Kolejka kolejka = Kolejka(m*n,labirynt);
  90.  
  91. int we_x,we_y,wy_x,wy_y,pom;
  92. cin>>we_y>>we_x>>wy_y>>wy_x;
  93.  
  94.  
  95. for (int i=0; i<n*m; i++)
  96. {cin >> pom;
  97. switch (pom)
  98. {
  99.  
  100. case -1:
  101. {*(labirynt + i ) = element(i/m,i%m,sciana);
  102. break;
  103. }
  104. case 0:
  105. {
  106. *(labirynt + i ) = element(i/m,i%m,droga);
  107. break;
  108.  
  109. }
  110. case -5:
  111. { if (i/m == we_y && i%m == we_x)
  112. {*(labirynt + i ) = element(i/m,i%m,wejscie);
  113. numerWejscia = i;}
  114. else if (i/m == wy_y && i%m == wy_x)
  115. {*(labirynt + i ) = element(i/m,i%m,wyjscie);
  116. numerWyjscia = i;}
  117. break;
  118. }}}
  119.  
  120.  
  121. if (wy_y >= n || wy_x >=m ) {cout<<"NIE WYJDZIESZ ;("; return 0;free(labirynt);}
  122. kolejka.dodaj(numerWejscia);
  123. int wynik=m*n;
  124. while (!kolejka.pusta())
  125. {
  126. element * pom = labirynt + kolejka.usun();
  127. int czasDojsciaPom = pom->czasDojscia;
  128.  
  129. if (pom->typ==wyjscie)
  130. {
  131. if (pom->czasDojscia<wynik);
  132. wynik = pom->czasDojscia;
  133.  
  134. }
  135. if (czyMozna(pom->x-1,pom->y,n,m,labirynt)) {(labirynt+pom->x-1+pom->y*m)->czasDojscia = czasDojsciaPom+1; kolejka.dodaj(pom->x-1+pom->y*m);}
  136. if (czyMozna(pom->x+1,pom->y,n,m,labirynt)) {(labirynt+pom->x+1+pom->y*m)->czasDojscia = czasDojsciaPom+1;kolejka.dodaj(pom->x+1+pom->y*m);}
  137. if (czyMozna(pom->x,pom->y-1,n,m,labirynt)) {(labirynt+pom->x+(pom->y-1)*m)->czasDojscia = czasDojsciaPom+1;kolejka.dodaj(pom->x+(pom->y-1)*m);}
  138. if (czyMozna(pom->x,pom->y+1,n,m,labirynt)) {(labirynt+pom->x+(pom->y+1)*m)->czasDojscia = czasDojsciaPom+1;kolejka.dodaj(pom->x+(pom->y+1)*m);}
  139.  
  140.  
  141. }
  142. if (wynik==m*n) cout<<"NIE WYJDZIESZ ;(";
  143. else cout<<wynik;free(labirynt);
  144. }
Add Comment
Please, Sign In to add comment