Cod sursa(job #3268123)

Utilizator Gergo123Schradi Gergo Gergo123 Data 13 ianuarie 2025 18:19:58
Problema Grozavesti Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

void citire_date(const string &nume_fisier, int &N, vector<vector<int>> &caroiaj) {
    ifstream f(nume_fisier);
    f >> N;
    caroiaj.resize(N, vector<int>(N));
    for (int i = 0; i < N; ++i) {
        for (int j = 0; j < N; ++j) {
            f >> caroiaj[i][j];
        }
    }
}

void interschimbare_linii(vector<vector<int>> &caroiaj, int x, int y) {
    swap(caroiaj[x], caroiaj[y]);
}

void interschimbare_coloane(vector<vector<int>> &caroiaj, int x, int y) {
    for (int i = 0; i < caroiaj.size(); ++i) {
        swap(caroiaj[i][x], caroiaj[i][y]);
    }
}

vector<pair<char, pair<int, int>>> ordonare_diagonala(vector<vector<int>> &caroiaj, int N) {
    vector<pair<int, int>> diagonala(N);
    for (int i = 0; i < N; ++i) {
        diagonala[i] = {caroiaj[i][i], i};
    }

    vector<pair<char, pair<int, int>>> interschimbari;
    sort(diagonala.begin(), diagonala.end());

    vector<bool> vizitat(N, false);
    for (int i = 0; i < N; ++i) {
        if (vizitat[i] || diagonala[i].second == i) continue;

        int j = i;
        while (!vizitat[j]) {
            vizitat[j] = true;
            int dest = diagonala[j].second;
            if (j != dest) {
                if (j != i) {
                    interschimbare_linii(caroiaj, j, i);
                    interschimbari.push_back({'L', {j + 1, i + 1}});
                }
                interschimbare_coloane(caroiaj, i, dest);
                interschimbari.push_back({'C', {i + 1, dest + 1}});
            }
            j = dest;
        }
    }
    return interschimbari;
}

void scrie_rezultate(const string &nume_fisier, const vector<pair<char, pair<int, int>>> &interschimbari) {
    ofstream f(nume_fisier);
    f << interschimbari.size() << "\n";
    for (const auto &interschimbare : interschimbari) {
        f << interschimbare.first << " " << interschimbare.second.first << " " << interschimbare.second.second << "\n";
    }
}

int main() {
    int N;
    vector<vector<int>> caroiaj;
    citire_date("grozavesti.in", N, caroiaj);

    auto interschimbari = ordonare_diagonala(caroiaj, N);

    scrie_rezultate("grozavesti.out", interschimbari);

    return 0;
}