31412023-02-20 09:35:08sztomiHanoi tornyai variáns (45)cpp11Hibás válasz 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";
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base0/45
1Hibás válasz0/03ms1832 KiB
2Hibás válasz0/03ms2188 KiB
3Hibás válasz0/23ms2268 KiB
4Futási hiba0/23ms2496 KiB
5Futási hiba0/228ms64288 KiB
6Futási hiba0/328ms64048 KiB
7Futási hiba0/227ms63808 KiB
8Hibás válasz0/23ms3168 KiB
9Futási hiba0/23ms3552 KiB
10Futási hiba0/23ms3652 KiB
11Futási hiba0/23ms3908 KiB
12Futási hiba0/23ms3948 KiB
13Futási hiba0/228ms62864 KiB
14Futási hiba0/24ms4964 KiB
15Futási hiba0/232ms62556 KiB
16Hibás válasz0/218ms6436 KiB
17Futási hiba0/228ms62548 KiB
18Futási hiba0/24ms6596 KiB
19Futási hiba0/34ms5948 KiB
20Futási hiba0/34ms6772 KiB
21Hibás válasz0/324ms6936 KiB
22Futási hiba0/328ms62116 KiB