Pagini recente » Cod sursa (job #2347257) | Cod sursa (job #1977382) | Cod sursa (job #1705770) | Cod sursa (job #1869250) | Cod sursa (job #3268123)
#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;
}