3141 2023. 02. 20 09:35:08 sztomi Hanoi tornyai variáns (45) cpp11 Hibás válasz 0/45 32ms 64288 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

vector<pii> mo;
vector<vector<int>> oszlop;

int harmadik(int egyik, int masik){
    return 3-egyik-masik;
}

void atrak(int honnan, int mennyit, int hova){
    if(mennyit == 0){
        return;
    }
    atrak(honnan, mennyit-1, harmadik(honnan, hova));

    mo.push_back({honnan, hova});
    int ideigl = oszlop[honnan].back();
    oszlop[honnan].pop_back();
    oszlop[hova].push_back(ideigl);

    atrak(harmadik(honnan, hova), mennyit-1, hova);
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);

    oszlop.assign(3, vector<int>());
    int legn = 0;
    int x;
    for(int i = 0; i < 3; i++){
        while(true){
            cin >> x;
            if(!x)break;
            oszlop[i].push_back(x);
            legn = max(legn, x);
        }
    }
    vector<vector<int>> cel(3, vector<int>());
    for(int i = 0; i < 3; i++){
        while(true){
            cin >> x;
            if(!x)break;
            cel[i].push_back(x);
        }
    }

    for(int i = 2; i <= legn; i++){
        // oszlop, magassag
        pii hely1, hely2;
        for(int j = 0; j < 3; j++){
            for(int k = 0; k < oszlop[j].size(); k++){
                if(oszlop[j][k] == i){
                    hely1 = {j, k};
                }
                if(oszlop[j][k] == i-1){
                    hely2 = {j, k};
                }
            }
        }
        if(hely1.first == hely2.first) continue;

        if(hely1.second != oszlop[hely1.first].size()-1){
            cout << "ERROR\n";
        }

        atrak(hely2.first, oszlop[hely2.first].size()-hely2.second, hely1.first);
    }

    for(int i = legn; i >= 1; i--){
        pii hely1, hely2;
        for(int j = 0; j < 3; j++){
            for(int k = 0; k < oszlop[j].size(); k++){
                if(oszlop[j][k] == i){
                    hely1 = {j, k};
                }
            }
        }
        for(int j = 0; j < 3; j++){
            for(int k = 0; k < cel[j].size(); k++){
                if(cel[j][k] == i){
                    hely2 = {j, k};
                }
            }
        }

        // felette levoket at kell rakni nem abba az oszlop amire rakni kell
        int felette = oszlop[hely1.first].size()-1 - hely1.second;
        atrak(hely1.first, felette, harmadik(hely1.first, hely2.first));
        // ot is atrakjuk a helyere
        atrak(hely1.first, 1, hely2.first);
    }
    cout << mo.size() << "\n";
    for(auto x : mo){
        cout << x.first+1 << " " << x.second+1 << "\n";
    }
}
Részfeladat Összpont Teszt Verdikt Idő Memória
base 0/45
1 Hibás válasz 0/0 3ms 1832 KiB
2 Hibás válasz 0/0 3ms 2188 KiB
3 Hibás válasz 0/2 3ms 2268 KiB
4 Futási hiba 0/2 3ms 2496 KiB
5 Futási hiba 0/2 28ms 64288 KiB
6 Futási hiba 0/3 28ms 64048 KiB
7 Futási hiba 0/2 27ms 63808 KiB
8 Hibás válasz 0/2 3ms 3168 KiB
9 Futási hiba 0/2 3ms 3552 KiB
10 Futási hiba 0/2 3ms 3652 KiB
11 Futási hiba 0/2 3ms 3908 KiB
12 Futási hiba 0/2 3ms 3948 KiB
13 Futási hiba 0/2 28ms 62864 KiB
14 Futási hiba 0/2 4ms 4964 KiB
15 Futási hiba 0/2 32ms 62556 KiB
16 Hibás válasz 0/2 18ms 6436 KiB
17 Futási hiba 0/2 28ms 62548 KiB
18 Futási hiba 0/2 4ms 6596 KiB
19 Futási hiba 0/3 4ms 5948 KiB
20 Futási hiba 0/3 4ms 6772 KiB
21 Hibás válasz 0/3 24ms 6936 KiB
22 Futási hiba 0/3 28ms 62116 KiB