Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <array>
- #include <set>
- #include <vector>
- #include <utility>
- #include <algorithm>
- using vasos = std::array<int, 3>;
- int main( ) {
- int v, w, n;
- std::scanf("%d%d%d", &v, &w, &n);
- int pos[n + 2];
- for (int i = 1; i <= n; ++i) {
- std::scanf("%d", &pos[i]);
- }
- pos[0] = 0;
- pos[n + 1] = v;
- std::set<vasos> memo;
- std::vector<std::pair<vasos, int>> cola;
- int ini = 0, fin = 1;
- cola.push_back({ { v, 0, 0 }, -1 });
- for (int d = 0; ini != fin; ++d) {
- for (int f = fin; ini != f; ++ini) {
- auto actual = cola[ini];
- if (actual.first[0] == w || actual.first[1] == w || actual.first[2] == w) {
- std::printf("%d\n", d);
- auto temp = actual;
- std::vector<vasos> solucion;
- while (temp.second != -1) {
- vasos ti = temp.first;
- solucion.push_back(ti);
- temp = cola[temp.second];
- }
- std::reverse(solucion.begin( ), solucion.end( ));
- vasos ant = { v, 0, 0 }, act, sol;
- for (int i = 0; i < d; ++i, std::swap(ant, act)) {
- act = solucion[i];
- for (int j = 0; j < 3; ++j) {
- if (ant[j] != act[j]) {
- sol[(ant[j] > act[j] ? 0 : 1)] = j;
- sol[2] = std::abs(ant[j] - act[j]);
- }
- }
- std::printf("%d %d %d\n", sol[0], sol[1], sol[2]);
- }
- return 0;
- }
- for (int k = 0; k < 3; ++k) {
- for (int it : pos) {
- int tope[2] = { (k + 1) % 3, (k + 2) % 3 };
- for (int q = 0; q < 2; ++q) {
- vasos temp = actual.first;
- int x = it - temp[tope[q]];
- if (x >= 0 && x <= v - temp[tope[q]] && temp[k] >= x) {
- temp[k] -= x;
- temp[tope[q]] += x;
- auto itr = memo.insert(temp);
- if (itr.second) {
- cola.push_back({ temp, ini }), ++fin;
- }
- }
- }
- }
- }
- }
- }
- std::printf("-1\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement