31412023-02-20 09:35:08sztomiHanoi tornyai variáns (45)cpp11Wrong answer 0/4532ms64288 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";
    }
}
SubtaskSumTestVerdictTimeMemory
base0/45
1Wrong answer0/03ms1832 KiB
2Wrong answer0/03ms2188 KiB
3Wrong answer0/23ms2268 KiB
4Runtime error0/23ms2496 KiB
5Runtime error0/228ms64288 KiB
6Runtime error0/328ms64048 KiB
7Runtime error0/227ms63808 KiB
8Wrong answer0/23ms3168 KiB
9Runtime error0/23ms3552 KiB
10Runtime error0/23ms3652 KiB
11Runtime error0/23ms3908 KiB
12Runtime error0/23ms3948 KiB
13Runtime error0/228ms62864 KiB
14Runtime error0/24ms4964 KiB
15Runtime error0/232ms62556 KiB
16Wrong answer0/218ms6436 KiB
17Runtime error0/228ms62548 KiB
18Runtime error0/24ms6596 KiB
19Runtime error0/34ms5948 KiB
20Runtime error0/34ms6772 KiB
21Wrong answer0/324ms6936 KiB
22Runtime error0/328ms62116 KiB