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>;
- std::array<int, 3> solve(std::array<int, 3> a, std::array<int, 3> b) {
- if (a[0] == b[0]) {
- if (a[1] > b[1]) {
- return {1, 2, a[1] - b[1]};
- } else {
- return {2, 1, a[2] - b[2]};
- }
- } else if (a[1] == b[1]) {
- if (a[0] > b[0]) {
- return {0, 3, a[0] - b[0]};
- } else {
- return {3, 0, a[3] - b[3]};
- }
- } else {
- if (a[0] > b[0]) {
- return { 0, 1, a[0] - b[0] };
- } else {
- return { 1, 0, a[1] - b[1] };
- }
- }
- }
- int main( ) {
- freopen("in.txt", "r", stdin);
- int v, w, n;
- std::scanf("%d%d%d", &v, &w, &n);
- int pos[n];
- for (int i = 0; i < n; ++i) {
- std::scanf("%d", &pos[i]);
- }
- std::set<vasos> memo;
- std::vector<vasos> solucion;
- 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];
- //std::printf("%d %d %d\n", actual.first[0], actual.first[1], actual.first[2]);
- if (actual.first[0] == w || actual.first[1] == w || actual.first[2] == w) {
- std::printf("%d\n", d);
- auto temp = actual;
- while (temp.second != -1) {
- vasos ti = temp.first;
- solucion.push_back(ti);
- temp = cola[temp.second];
- }
- std::reverse(solucion.begin( ), solucion.end( ));
- for (int i = 0; i < d; ++i) {
- if (i) {
- std::array<int, 3> test = solve(solucion[i - 1], solucion[i]);
- std::printf("%d %d %d\n", test[0], test[1], test[2]);
- } else {
- std::array<int, 3> test = solve({ v, 0, 0 }, solucion[i]);
- std::printf("%d %d %d\n", test[0], test[1], test[2]);
- }
- }
- return 0;
- }
- for (int k = 0; k < 3; ++k) {
- for (int it : pos) {
- vasos temp1 = actual.first;
- int x = it - temp1[k + 1 % 3];
- if (x >= 0 && x <= v - temp1[k + 1 % 3] - 1 && temp1[k] >= x) {
- temp1[k] -= x;
- temp1[k + 1 % 3] += x;
- auto itr = memo.find(temp1);
- if (itr == memo.end( )) {
- //std::printf("%d %d %d*\n", temp1[0], temp1[1], temp1[2]);
- cola.push_back({ temp1, ini }), ++fin;
- memo.insert(temp1);
- //std::printf("%d %d*\n", k, it);
- }
- }
- vasos temp2 = actual.first;
- int y = it - temp2[k + 2 % 3];
- if (y >= 0 && y <= v - temp2[k + 2 % 3] - 1 && temp2[k] >= y) {
- temp2[k] -= y;
- temp2[k + 2 % 3] += y;
- auto itr = memo.find(temp2);
- if (itr == memo.end( )) {
- //std::printf("%d %d %d*\n", temp2[0], temp2[1], temp2[2]);
- cola.push_back({ temp2, ini }), ++fin;
- memo.insert(temp2);
- //std::printf("%d %d+\n", k, it);
- }
- }
- }
- //std::printf("k: %d\n", k);
- }
- }
- }
- std::printf("-1\n");
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement