Advertisement
a53

Susan

a53
May 17th, 2018
191
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.22 KB | None | 0 0
  1. /**
  2. Problema Turn - Constantinescu Eduard
  3. Inspirata din problema Traseu - Carmen Minca
  4. Algoritm de rezolvare: Lee cu mici modificari
  5. Complexitate Timp O(n*n*n)
  6. */
  7.  
  8.  
  9. #include <bits/stdc++.h>
  10.  
  11. using namespace std;
  12.  
  13. FILE *fin = fopen("turn.in", "r");
  14. FILE *fout = fopen("turn.out", "w");
  15.  
  16. int n;
  17.  
  18. struct
  19. {
  20. int prop, val;
  21. ///prop = 1 => scara sus
  22. ///prop = 2 => scara jos
  23. ///prop = 3 => groapa
  24. ///prop = 0 => gol
  25. } cub[105][105][105];
  26.  
  27. struct
  28. {
  29. int x, y, z; ///coordonatele in cub
  30. } C[105*105*105], vec, poz, sf;
  31.  
  32. int dx[] = {1, 0, 0, 0, 0, -1}; ///cele 4 directii
  33. int dy[] = {0, 0, -1, 0, 1, 0};
  34. int dz[] = {0, 1, 0, -1, 0, 0};
  35.  
  36. /**
  37.  
  38.  
  39. dx = 1 0 0 0 0 -1
  40. dy = 0 0-1 0 1 0
  41. dz = 0 1 0-1 0 0
  42.  
  43. x = sus
  44. y = dreapta
  45. z = spate
  46.  
  47. */
  48.  
  49. void bordare() ///bordare simpla a matricei
  50. {
  51. register int i, j;
  52. for(i = 0; i <= n+1; i++)
  53. for(j = 0; j <= n+1; j++)
  54. {
  55. cub[i][0][j].val = -1;
  56. cub[i][n+1][j].val = -1;
  57. }
  58. for(i = 0; i <= n+1; i++)
  59. for(j = 0; j <= n+1; j++)
  60. {
  61. cub[i][j][n+1].val = -1;
  62. cub[i][j][0].val = -1;
  63. }
  64. for(i = 0; i <= n+1; i++)
  65. for(j = 0; j <= n+1; j++)
  66. {
  67. cub[n+1][i][j].val = -1;
  68. cub[0][i][j].val = -1;
  69. }
  70. }
  71.  
  72. void citire()
  73. {
  74. int z, s, j, o;
  75. fscanf(fin, "%d%d%d%d%d", &n, &z, &s, &j, &o); ///citirea valorilor
  76. int a, b, c;
  77. for(int i = 1; i <= z; i++) /// se citesc coord ziduri
  78. {
  79. fscanf(fin, "%d%d%d", &a, &b, &c);
  80. cub[a][b][c].val = -1;
  81. }
  82. for(int i = 1; i <= s; i++)/// se citesc coord scari sus
  83. {
  84. fscanf(fin, "%d%d%d", &a, &b, &c);
  85. cub[a][b][c].prop = 1;
  86. }
  87. for(int i = 1; i <= j; i++)/// se citesc coord scari jos
  88. {
  89. fscanf(fin, "%d%d%d", &a, &b, &c);
  90. cub[a][b][c].prop = 2;
  91. }
  92. for(int i = 1; i <= o; i++)/// se citesc coord gropi
  93. {
  94. fscanf(fin, "%d%d%d", &a, &b, &c);
  95. cub[a][b][c].prop = 3;
  96. }
  97.  
  98. fscanf(fin, "%d%d%d", &poz.x, &poz.y, &poz.z); ///se citesc coord
  99. fscanf(fin, "%d%d%d", &sf.x, &sf.y, &sf.z); /// de inceput si sf
  100.  
  101. }
  102.  
  103. void rezolvare() ///un lee cu mici modificari
  104. {
  105. int prim, ultim, k, s = 1, l;
  106.  
  107. prim = ultim = 0;
  108. C[0] = poz;
  109. cub[poz.x][poz.y][poz.z].val = 1; ///marcam pozitia de inceput
  110.  
  111. while(prim <= ultim && cub[sf.x][sf.y][sf.z].val == 0) /// cat timp am el in coada
  112. {
  113. ///si nu am ajuns la sf
  114. poz = C[prim];
  115. ++prim; /// extrag din coada
  116.  
  117. if(cub[poz.x][poz.y][poz.z].prop == 3) ///este groapa
  118. {
  119. int d = 0;
  120. vec = poz; /// pornim de la pozitia gropii
  121. while(vec.x > 1 && cub[vec.x][vec.y][vec.z].prop == 3)
  122. --vec.x, d++;///cat timp suntem in cub si suntem pe o groapa, vom cadea
  123. if(cub[vec.x][vec.y][vec.z].val == 0) ///este liber
  124. {
  125. cub[vec.x][vec.y][vec.z].val = cub[poz.x][poz.y][poz.z].val+d;
  126. ultim++;///marchez drumul si adaug in coada
  127. C[ultim] = vec;
  128. }
  129. }
  130.  
  131. else
  132. {
  133. if(cub[poz.x][poz.y][poz.z].prop == 1)
  134. {
  135. k = 0;
  136. l = 4;
  137. }
  138. else if(cub[poz.x][poz.y][poz.z].prop == 2)
  139. {
  140. k = 1;
  141. l = 5;
  142. }
  143. else
  144. {
  145. k = 1;
  146. l = 4;
  147. }
  148. for(k; k <= l; k++) ///parcurg in cele 4 directii posibile
  149. {
  150. vec.x = poz.x + dx[k];
  151. vec.y = poz.y + dy[k];
  152. vec.z = poz.z + dz[k];
  153. if(cub[vec.x][vec.y][vec.z].val == 0)///este liber
  154. {
  155. cub[vec.x][vec.y][vec.z].val = cub[poz.x][poz.y][poz.z].val + 1;
  156. ultim++; ///marchez drumul si adaug in coada
  157. C[ultim] = vec;
  158. }
  159. }
  160.  
  161. }
  162. }
  163. fprintf(fout, "%d\n", cub[sf.x][sf.y][sf.z].val);
  164. ///afisez rezultatul
  165. }
  166.  
  167. int main()
  168. {
  169. citire();
  170. bordare();
  171. rezolvare();
  172. return 0;
  173. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement