Cod sursa(job #2916106)

Utilizator alin.gabrielAlin Gabriel Arhip alin.gabriel Data 28 iulie 2022 05:46:53
Problema Trapez Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <fstream>
#include <tuple>
#include <set>
using namespace std;

typedef tuple<int, int, int, int> tup;

int x[1000], y[1000];
set<tup> ms;
set<tuple<int,int>> pf;

bool ispgram(tup e1, tup e2) {
    if (get<0>(e1) == get<0>(e2) && get<2>(e1) == get<2>(e2)) { // same ox
        if (get<1>(e1) - get<1>(e2) == get<3>(e1) - get<3>(e2))
            return true;
    } else if (get<1>(e1) == get<1>(e2) && get<3>(e1) == get<3>(e2)) { // same oy
        if (get<0>(e1) - get<0>(e2) == get<2>(e1) - get<2>(e2))
            return true;
    }
    return false;
}

void markComb(tup e1, tup e2) {
    pf.insert(make_tuple(get<0>(e1), get<1>(e1)));
    pf.insert(make_tuple(get<2>(e1), get<3>(e1)));
    pf.insert(make_tuple(get<0>(e2), get<1>(e2)));
    pf.insert(make_tuple(get<2>(e2), get<3>(e2)));
}

int main() {
    ifstream fin("trapez.in");
    ofstream fout("trapez.out");

    int n, s = 0;
    fin >> n;
    for (int i = 0; i < n; i++)
        fin >> x[i] >> y[i];
    fin.close();

    for (int i = 0 ; i < n; i++)
        for (int j = i + 1; j < n; j++)
            if (x[i] == x[j] || y[i] == y[j])
                ms.insert(make_tuple(x[i], y[i], x[j], y[j]));

    while (!ms.empty()) {
        tuple e1 = *ms.begin();
        ms.erase(ms.begin());

        //cout << "tuple e1 este: " << get<0>(e1) << " " << get<1>(e1) << " " << get<2>(e1) << " " << get<3>(e1) << "\n";

        for (tuple e2 : ms) {
            if ((get<0>(e1) == get<0>(e2) && get<1>(e1) == get<1>(e2)) ||
                (get<0>(e1) == get<2>(e2) && get<1>(e1) == get<3>(e2)) ||
                (get<2>(e1) == get<2>(e2) && get<3>(e1) == get<3>(e2)) ||
                (get<2>(e1) == get<0>(e2) && get<3>(e1) == get<1>(e2)))
                continue;

            int count = 0;
            for (tuple<int,int> e : pf)
                if ((get<0>(e) == get<0>(e1) && get<1>(e) == get<1>(e1)) ||
                    (get<0>(e) == get<2>(e1) && get<1>(e) == get<3>(e1)) ||
                    (get<0>(e) == get<0>(e2) && get<1>(e) == get<1>(e2)) ||
                    (get<0>(e) == get<2>(e2) && get<1>(e) == get<3>(e2)))
                    count++;
            if (count == 4)
                continue;
            else 
                markComb(e1, e2);

            if (ispgram(e1, e2)) {
                //cout << "pgram este1: " << get<0>(e1) << " " << get<1>(e1) << " " << get<2>(e1) << " " << get<3>(e1) << "\n";
                //cout << "pgram este2: " << get<0>(e2) << " " << get<1>(e2) << " " << get<2>(e2) << " " << get<3>(e2) << "\n";
                s++;
            }
            s++;
        }
    }

    //cout << "s este: " << s << "\n";

    fout << s;
    fout.close();
    return 0;
}