Advertisement
Guest User

Untitled

a guest
Apr 25th, 2015
226
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <climits>
  4. using namespace std;
  5.  
  6. class Mapa{
  7. public:
  8. int szer;
  9. int wys;
  10. void setSzer(int szer) { this->szer = szer; }
  11. void setWys(int wys) { this->wys = wys; }
  12. int getSzer(){ return szer - 1; }
  13. int getWys(){ return wys - 1; }
  14. };
  15.  
  16. class xy{
  17. public:
  18. int x, y;
  19. };
  20.  
  21. class Wyciag{
  22. int x1, y1, x2, y2;
  23. int t; //czas trwania podrózy
  24. int min; //minuty odjazdu - wielokrotnosci min
  25. bool jest;
  26. public:
  27. void setx1(int x1) { this->x1 = x1; }
  28. void sety1(int y1) { this->y1 = y1; }
  29. int getx1(){ return x1; }
  30. int gety1(){ return y1; }
  31. void setx2(int x2) { this->x2 = x2; }
  32. void sety2(int y2) { this->y2 = y2; }
  33. int getx2(){ return x2; }
  34. int gety2(){ return y2; }
  35. void setT(int t) { this->t = t; }
  36. void setMin(int min) { this->min = min; }
  37. int getT(){ return t; }
  38. int getMin(){ return min; }
  39. bool Jest(){ return jest; }
  40. void setJest(bool jest){ this->jest = jest; }
  41. };
  42.  
  43. class Wezel{
  44. int x;
  45. int y;
  46. int wys;
  47. bool odwiedzony;
  48. public:
  49. void setOdwiedz(bool odw){ this->odwiedzony = odw; }
  50. bool getOdwiedz(){ return this->odwiedzony; }
  51. void setX(int x){ this->x = x; }
  52. int getX(){ return x; }
  53. void setY(int y){ this->y = y; }
  54. int getY(){ return y; }
  55. void setWys(int wysokosc){ wys = wysokosc; }
  56. int getWys(){ return wys; }
  57. };
  58.  
  59. void Dijkstra(int x, int y, int x1, int y1, int **tablica, Wezel **wezly, Mapa mapa, Wyciag *wyciagi, int h, xy xy);
  60.  
  61. int Mniejsza(int a, int b){
  62. if (a <= b) return a;
  63. else return b;
  64. }
  65.  
  66. int Czas(int x1, int y1, int x2, int y2, Wezel **wezly, Wyciag *wyciagi, int **tablica, int h){
  67. if (h){
  68. int i = 0;
  69. while (wyciagi[i].Jest()){
  70.  
  71. int f = 0;
  72. if (x1 == wyciagi[i].getx1() && y1 == wyciagi[i].gety1()){
  73. int czas = wyciagi[i].getMin();
  74. if (tablica[x1][y1] % czas){
  75. f = czas - (tablica[x1][y1] % czas);
  76. }
  77. int x2 = wyciagi[i].getx2(), y2 = wyciagi[i].gety2();
  78. tablica[x2][y2] = tablica[x1][y1] + Mniejsza(tablica[x2][y2], wyciagi[i].getT() + f);
  79. }
  80. i++;
  81. }
  82. }
  83.  
  84. int a, b;
  85. a = wezly[x1][y1].getWys();
  86. b = wezly[x2][y2].getWys();
  87. if (a >= b) return 1;
  88. else if (b > a) return (b - a + 1);
  89. else return 1;
  90. }
  91.  
  92.  
  93. xy Szukaj(int x1, int y1, int **tablica, Wezel **wezly, Mapa mapa, xy xy){
  94. int tmp = INT_MAX;
  95. int x = 0, y = 0;
  96. int wys = mapa.getWys(), szer = mapa.getSzer();
  97. for (int i = 0; i <= wys; i++){
  98. for (int j = 0; j <= szer; j++){
  99. if (tablica[j][i] < tmp && !(wezly[j][i].getOdwiedz())){
  100. tmp = tablica[j][i];
  101. x = j;
  102. y = i;
  103. }
  104. }
  105. }
  106. if (x == x1 && y == y1){
  107. xy.x = x1;
  108. xy.y = y1;
  109. }
  110. else {
  111. xy.x = x;
  112. xy.y = y;
  113. }
  114. return xy;
  115. }
  116.  
  117.  
  118. void Dijkstra(int x, int y, int x1, int y1, int **tablica, Wezel **wezly, Mapa mapa, Wyciag *wyciagi, int h, xy xy){
  119. wezly[x1][y1].setOdwiedz(false);
  120. wezly[x][y].setOdwiedz(true);
  121. {
  122. int tmp = 0;
  123. if (y == 0 && x == 0){
  124. if (!(wezly[x][y + 1].getOdwiedz()))
  125. {
  126. tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
  127. }
  128. if (!(wezly[x + 1][y].getOdwiedz())){
  129. tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
  130. }
  131. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  132. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  133. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  134.  
  135. }
  136. else if (y == mapa.getWys() && x == mapa.getSzer()){
  137. if (!(wezly[x][y - 1].getOdwiedz()))
  138. tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
  139. if (!(wezly[x - 1][y].getOdwiedz()))
  140. tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
  141. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  142. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  143. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  144. }
  145. else if (y == 0 && x == mapa.getSzer()){
  146. if (!(wezly[x][y + 1].getOdwiedz()))
  147. tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
  148. if (!(wezly[x - 1][y].getOdwiedz()))
  149. tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
  150.  
  151. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  152. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  153. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  154. }
  155. else if (y == mapa.getWys() && x == 0){
  156. if (!(wezly[x][y - 1].getOdwiedz()))
  157. tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
  158. if (!(wezly[x + 1][y].getOdwiedz()))
  159. tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
  160.  
  161. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  162. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  163. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  164. }
  165. else if (y == mapa.getWys()){
  166. if (!(wezly[x + 1][y].getOdwiedz()))
  167. tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h) + tablica[x][y]);
  168. if (!(wezly[x - 1][y].getOdwiedz()))
  169. tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h) + tablica[x][y]);
  170. if (!(wezly[x][y - 1].getOdwiedz()))
  171. tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h) + tablica[x][y]);
  172.  
  173. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  174. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  175. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  176. }
  177.  
  178.  
  179. else if (y == 0){
  180. if (!(wezly[x + 1][y].getOdwiedz()))
  181. tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
  182. if (!(wezly[x - 1][y].getOdwiedz()))
  183. tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
  184. if (!(wezly[x][y + 1].getOdwiedz()))
  185. tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
  186.  
  187. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  188. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  189. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  190. }
  191.  
  192. else if (x == mapa.getSzer()){
  193. if (!(wezly[x][y + 1].getOdwiedz()))
  194. tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
  195. if (!(wezly[x - 1][y].getOdwiedz()))
  196. tablica[x - 1][y] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
  197. if (!(wezly[x][y - 1].getOdwiedz()))
  198. tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
  199.  
  200. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  201. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  202. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  203. }
  204. else if (x == 0){
  205. if (!(wezly[x][y + 1].getOdwiedz()))
  206. tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
  207. if (!(wezly[x][y - 1].getOdwiedz()))
  208. tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
  209. if (!(wezly[x + 1][y].getOdwiedz()))
  210. tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
  211.  
  212. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  213. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  214. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  215. }
  216.  
  217. else {
  218. if (!(wezly[x + 1][y].getOdwiedz()))
  219. tablica[x + 1][y] = Mniejsza(tablica[x + 1][y], tablica[x][y] + Czas(x, y, x + 1, y, wezly, wyciagi, tablica, h));
  220. if (!(wezly[x - 1][y].getOdwiedz()))
  221. tablica[x - 1][y] = Mniejsza(tablica[x - 1][y], tablica[x][y] + Czas(x, y, x - 1, y, wezly, wyciagi, tablica, h));
  222. if (!(wezly[x][y + 1].getOdwiedz()))
  223. tablica[x][y + 1] = Mniejsza(tablica[x][y + 1], tablica[x][y] + Czas(x, y, x, y + 1, wezly, wyciagi, tablica, h));
  224. if (!(wezly[x][y - 1].getOdwiedz()))
  225. tablica[x][y - 1] = Mniejsza(tablica[x][y - 1], tablica[x][y] + Czas(x, y, x, y - 1, wezly, wyciagi, tablica, h));
  226.  
  227. xy = Szukaj(x1, y1, tablica, wezly, mapa, xy);
  228. if (xy.x == x1 && xy.y == y1) cout << tablica[x1][y1];
  229. else Dijkstra(xy.x, xy.y, x1, y1, tablica, wezly, mapa, wyciagi, h, xy);
  230. }
  231. }
  232. }
  233.  
  234. int main()
  235. {
  236. Mapa mapa;
  237. xy xy;
  238. xy.x = 0;
  239. xy.y = 0;
  240. int tmp;
  241. scanf("%d", &tmp);
  242. mapa.setSzer(tmp);
  243. scanf("%d", &tmp);
  244. mapa.setWys(tmp);
  245. int x1, y1, x2, y2, il_wyciagow = 0;
  246. scanf("%d", &x1);
  247. scanf("%d", &y1);
  248. scanf("%d", &x2);
  249. scanf("%d", &y2);
  250. scanf("%d", &il_wyciagow);
  251. int n = 0;
  252. Wyciag *wyciagi = new Wyciag[il_wyciagow];
  253.  
  254.  
  255. while (n < il_wyciagow){
  256. wyciagi[n].setJest(true);
  257. scanf("%d", &tmp);
  258. wyciagi[n].setx1(tmp);
  259. scanf("%d", &tmp);
  260. wyciagi[n].sety1(tmp);
  261. scanf("%d", &tmp);
  262. wyciagi[n].setx2(tmp);
  263. scanf("%d", &tmp);
  264. wyciagi[n].sety2(tmp);
  265. scanf("%d", &tmp);
  266. wyciagi[n].setT(tmp);
  267. scanf("%d", &tmp);
  268. wyciagi[n].setMin(tmp);
  269. n++;
  270. }
  271.  
  272. int h = il_wyciagow;
  273. char cmd;
  274. int l;
  275.  
  276. int wys = mapa.getWys(), szer = mapa.getSzer();
  277. int **tablica = new int*[szer + 1];
  278. Wezel **wezly = new Wezel*[szer + 1];
  279.  
  280. for (int i = 0; i <= szer; i++){
  281. tablica[i] = new int[wys + 1];
  282. wezly[i] = new Wezel[wys + 1];
  283. }
  284. for (int i = 0; i <= wys; i++){
  285. for (int j = 0; j <= szer; j++){
  286. scanf("%d", &tmp);
  287. wezly[j][i].setOdwiedz(false);
  288. wezly[j][i].setWys(tmp);
  289. tablica[j][i] = INT_MAX;
  290. }
  291. }
  292. tablica[x1][y1] = 0;
  293.  
  294.  
  295. Dijkstra(x1, y1, x2, y2, tablica, wezly, mapa, wyciagi, h, xy);
  296.  
  297.  
  298. for (int i = 0; i <= szer; i++){
  299. delete tablica[i];
  300. delete wezly[i];
  301. }
  302. delete tablica;
  303. delete wezly;
  304. delete wyciagi;
  305. return 0;
  306. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement