Advertisement
AlejandroGY

Untitled

Mar 23rd, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.81 KB | None | 0 0
  1. #include <cstdio>
  2. #include <array>
  3. #include <set>
  4. #include <vector>
  5. #include <utility>
  6. #include <algorithm>
  7.  
  8. using vasos = std::array<int, 3>;
  9.  
  10. std::array<int, 3> solve(std::array<int, 3> a, std::array<int, 3> b) {
  11.     if (a[0] == b[0]) {
  12.         if (a[1] > b[1]) {
  13.             return {1, 2, a[1] - b[1]};
  14.         } else {
  15.             return {2, 1, a[2] - b[2]};
  16.         }
  17.     } else if (a[1] == b[1]) {
  18.         if (a[0] > b[0]) {
  19.             return {0, 3, a[0] - b[0]};
  20.         } else {
  21.             return {3, 0, a[3] - b[3]};
  22.         }
  23.     } else {
  24.         if (a[0] > b[0]) {
  25.             return { 0, 1, a[0] - b[0] };
  26.         } else {
  27.             return { 1, 0, a[1] - b[1] };
  28.         }
  29.     }
  30. }
  31.  
  32. int main( ) {
  33.     freopen("in.txt", "r", stdin);
  34.     int v, w, n;
  35.     std::scanf("%d%d%d", &v, &w, &n);
  36.  
  37.     int pos[n];
  38.     for (int i = 0; i < n; ++i) {
  39.         std::scanf("%d", &pos[i]);
  40.     }
  41.  
  42.     std::set<vasos> memo;
  43.     std::vector<vasos> solucion;
  44.     std::vector<std::pair<vasos, int>> cola;
  45.     int ini = 0, fin = 1;
  46.  
  47.     cola.push_back({ { v, 0, 0 }, -1 });
  48.  
  49.     for (int d = 0; ini != fin; ++d) {
  50.         for (int f = fin; ini != f; ++ini) {
  51.             auto actual = cola[ini];
  52.             //std::printf("%d %d %d\n", actual.first[0], actual.first[1], actual.first[2]);
  53.             if (actual.first[0] == w || actual.first[1] == w || actual.first[2] == w) {
  54.                 std::printf("%d\n", d);
  55.  
  56.                 auto temp = actual;
  57.                 while (temp.second != -1) {
  58.                     vasos ti = temp.first;
  59.                     solucion.push_back(ti);
  60.                     temp = cola[temp.second];
  61.                 }
  62.  
  63.                 std::reverse(solucion.begin( ), solucion.end( ));
  64.  
  65.                 for (int i = 0; i < d; ++i) {
  66.                     if (i) {
  67.                         std::array<int, 3> test = solve(solucion[i - 1], solucion[i]);
  68.                         std::printf("%d %d %d\n", test[0], test[1], test[2]);
  69.                     } else {
  70.                         std::array<int, 3> test = solve({ v, 0, 0 }, solucion[i]);
  71.                         std::printf("%d %d %d\n", test[0], test[1], test[2]);
  72.                     }
  73.                 }
  74.  
  75.                 return 0;
  76.             }
  77.  
  78.             for (int k = 0; k < 3; ++k) {
  79.                 for (int it : pos) {
  80.                     vasos temp1 = actual.first;
  81.                     int x = it - temp1[k + 1 % 3];
  82.                     if (x >= 0 && x <= v - temp1[k + 1 % 3] - 1 && temp1[k] >= x) {
  83.                         temp1[k] -= x;
  84.                         temp1[k + 1 % 3] += x;
  85.                         auto itr = memo.find(temp1);
  86.                         if (itr == memo.end( )) {
  87.                             //std::printf("%d %d %d*\n", temp1[0], temp1[1], temp1[2]);
  88.                             cola.push_back({ temp1, ini }), ++fin;
  89.                             memo.insert(temp1);
  90.                             //std::printf("%d %d*\n", k, it);
  91.                         }
  92.                     }
  93.  
  94.                     vasos temp2 = actual.first;
  95.                     int y = it - temp2[k + 2 % 3];
  96.                     if (y >= 0 && y <= v - temp2[k + 2 % 3] - 1 && temp2[k] >= y) {
  97.                         temp2[k] -= y;
  98.                         temp2[k + 2 % 3] += y;
  99.                         auto itr = memo.find(temp2);
  100.                         if (itr == memo.end( )) {
  101.                             //std::printf("%d %d %d*\n", temp2[0], temp2[1], temp2[2]);
  102.                             cola.push_back({ temp2, ini }), ++fin;
  103.                             memo.insert(temp2);
  104.                             //std::printf("%d %d+\n", k, it);
  105.                         }
  106.                     }
  107.                 }
  108.                 //std::printf("k: %d\n", k);
  109.             }
  110.         }
  111.     }
  112.     std::printf("-1\n");
  113. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement