31422023-02-20 09:56:23sztomiHanoi tornyai variáns (45)cpp11Hibás válasz 4/4535ms5688 KiB
#include <bits/stdc++.h>

using namespace std;

typedef pair<int, int> pii;

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

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>());
    alap.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);
            alap[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};
                }
            }
        }

        if(hely1.first == hely2.first) continue;

        // 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){
        if(x.first == x.second){
            //cout << "HIBA 1\n";
        }
        if(alap[x.second].size() > 0 && alap[x.first].back() > alap[x.second].back()){
            //cout << "HIBA 2\n";
        }
        alap[x.second].push_back(alap[x.first].back());
        alap[x.first].pop_back();
        cout << x.first+1 << " " << x.second+1 << "\n";
    }

    for(int i = 0; i < 3; i++){
        if(alap[i].size() != cel[i].size()){
            //cout << "HIBA 3\n";
        }
        for(int j = 0; j < alap[i].size(); j++){
            if(alap[i][j] != cel[i][j]){
                //cout << "HIBA 4\n";
            }
        }
    }
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
base4/45
1Hibás válasz0/03ms1808 KiB
2Elfogadva0/03ms2060 KiB
3Hibás válasz0/23ms2228 KiB
4Hibás válasz0/23ms2344 KiB
5Elfogadva2/23ms2540 KiB
6Hibás válasz0/33ms2756 KiB
7Hibás válasz0/23ms2844 KiB
8Hibás válasz0/23ms2972 KiB
9Hibás válasz0/23ms3064 KiB
10Hibás válasz0/23ms3188 KiB
11Hibás válasz0/23ms3288 KiB
12Elfogadva2/23ms3368 KiB
13Hibás válasz0/26ms3664 KiB
14Hibás válasz0/28ms3880 KiB
15Hibás válasz0/214ms4388 KiB
16Hibás válasz0/224ms5284 KiB
17Hibás válasz0/232ms5500 KiB
18Hibás válasz0/226ms5620 KiB
19Hibás válasz0/320ms5624 KiB
20Hibás válasz0/329ms5644 KiB
21Hibás válasz0/335ms5688 KiB
22Hibás válasz0/325ms5580 KiB