Advertisement
a53

tunel2

a53
Oct 9th, 2021
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.19 KB | None | 0 0
  1. /**
  2. * Diana Ghinea
  3. * iterativ + matrice N * M
  4. * O(M) timp
  5. * O(N * M) memorie suplimentara
  6. */
  7.  
  8. #include <iostream>
  9. #include <fstream>
  10. #include <vector>
  11.  
  12. using namespace std;
  13.  
  14. ifstream f("tunel2.in");
  15. ofstream g("tunel2.out");
  16.  
  17. const int NMAX = 1000;
  18. const int MMAX = 20000;
  19.  
  20. const int SUS = 0;
  21. const int JOS = 1;
  22. const int STANGA = 2;
  23. const int DREAPTA = 3;
  24.  
  25. int c, n, m, x;
  26.  
  27. bool pasaj_in_jos[NMAX + 2][MMAX + 2];
  28.  
  29. void citeste() {
  30. f >> c;
  31. f >> n >> m >> x;
  32.  
  33. for (int i = 1; i < n; i++) {
  34. int p;
  35. f >> p;
  36. for (int j = 1; j <= p; j++) {
  37. int poz;
  38. f >> poz;
  39. pasaj_in_jos[i][poz] = true;
  40. }
  41. }
  42. }
  43.  
  44. inline bool am_pasaj_in_jos(int i, int j) {
  45. return pasaj_in_jos[i][j];
  46. }
  47.  
  48. inline bool am_pasaj_in_sus(int i, int j) {
  49. return pasaj_in_jos[i - 1][j];
  50. }
  51.  
  52. void c1() {
  53. int i = x, j = 1;
  54. int vin_din = STANGA;
  55.  
  56. while (j <= m && !(i == n && j == m)) {
  57. if (vin_din == STANGA) {
  58. if (am_pasaj_in_sus(i, j)) {
  59. i--;
  60. vin_din = JOS;
  61. continue;
  62. }
  63. if (am_pasaj_in_jos(i, j)) {
  64. i++;
  65. vin_din = SUS;
  66. continue;
  67. }
  68. }
  69. j++;
  70. vin_din = STANGA;
  71. }
  72.  
  73. g << i << '\n';
  74. }
  75.  
  76. int traseu_c2(int i, int j, int vin_din, int pasaje) {
  77. while (j > 0) {
  78. if (vin_din == DREAPTA) {
  79. if (am_pasaj_in_sus(i, j)) {
  80. i--;
  81. vin_din = JOS;
  82. pasaje++;
  83. continue;
  84. }
  85. if (am_pasaj_in_jos(i, j)) {
  86. i++;
  87. vin_din = SUS;
  88. pasaje++;
  89. continue;
  90. }
  91. }
  92. j--;
  93. vin_din = DREAPTA;
  94. }
  95.  
  96. return m + 2 * pasaje;
  97. }
  98.  
  99. void c2() {
  100. int lungime_minima = traseu_c2(n, m - 1, DREAPTA, 0);
  101. if (am_pasaj_in_sus(n, m))
  102. lungime_minima = min(lungime_minima, traseu_c2(n - 1, m, JOS, 1));
  103. g << lungime_minima << '\n';
  104. }
  105.  
  106. int main() {
  107. citeste();
  108.  
  109. if (c == 1) c1();
  110. else c2();
  111. return 0;
  112. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement