Cod sursa(job #880294)

Utilizator Andrei1998Andrei Constantinescu Andrei1998 Data 16 februarie 2013 16:27:59
Problema Reuniune Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.73 kb
#include <fstream>

using namespace std;

//Un punct
struct punct
{
    long long int x;
    long long int y;
};

//Functia initializeaza un punct cu originea sistemului de coordonate
void init(punct &a)
{
    a.x=0;
    a.y=0;
}

//Un dreptunghi
struct dreptunghi
{
    punct st_jos;
    punct dr_sus;
};

//Functia initializeaza un dreptunghi cu originea sistemului de coordonate
void init(dreptunghi &a)
{
    a.st_jos.x=0;
    a.st_jos.y=0;

    a.dr_sus.x=0;
    a.dr_sus.y=0;
}

//Functia verifica daca dreptunghiurile a si b se intersecteaza
bool se_intersecteaza(dreptunghi &a,dreptunghi &b)
{
    //Avem 4 cazuri cand ele nu se intersecteaza
    if(a.dr_sus.x<b.st_jos.x)
        return 0;
    if(a.dr_sus.y<b.st_jos.y)
        return 0;
    if(a.st_jos.x>b.dr_sus.x)
        return 0;
    if(a.st_jos.y>b.dr_sus.y)
        return 0;

    return 1;
}

//Functiile de minim respectiv maxim
long long int minim(long long int a,long long int b)
{
    if(a<b)
        return a;
    return b;
}

long long int maxim(long long int a,long long int b)
{
    if(a>b)
        return a;
    return b;
}

//Functia returneaza intersectia a doua dreptunghiuri (rezultatul returnat va fi corect numai daca acestea se intersecteaza)
dreptunghi intersectie(dreptunghi &a, dreptunghi &b)
{
    dreptunghi aux;
    init(aux);

    aux.dr_sus.x=minim((a.dr_sus).x,(b.dr_sus).x);
    aux.dr_sus.y=minim((a.dr_sus).y,(b.dr_sus).y);

    aux.st_jos.x=maxim((a.st_jos).x,(b.st_jos).x);
    aux.st_jos.y=maxim((a.st_jos).y,(b.st_jos).y);

    return aux;
}

//Functia intoarce aria unui dreptunghi
long int arie(dreptunghi &a)
{
    return ((a.dr_sus.x-a.st_jos.x)*(a.dr_sus.y-a.st_jos.y));
}

//Functia intoarce perimetrul unui dreptunghi
long long int perimetru(dreptunghi &a)
{
    return (((a.dr_sus.x-a.st_jos.x)+(a.dr_sus.y-a.st_jos.y))*2);
}

int main()
{
    //Deschiderea fisierelor de intrare si ieisre
    ifstream fin("reuniune.in");
    ofstream fout("reuniune.out");

    //Se declara si se citesc cele trei dreptunghiuri din enunt
    dreptunghi a,b,c;

    fin>>a.st_jos.x>>a.st_jos.y;
    fin>>a.dr_sus.x>>a.dr_sus.y;

    fin>>b.st_jos.x>>b.st_jos.y;
    fin>>b.dr_sus.x>>b.dr_sus.y;

    fin>>c.st_jos.x>>c.st_jos.y;
    fin>>c.dr_sus.x>>c.dr_sus.y;

    //Dreptunghiurile a*b, a*c, b*c si a*b*c (unde "*" reprezinta operatia de intersectie a multumilor)
    dreptunghi ab,ac,bc,abc;

    //Se calculeaza a*b (sau se se initializeaza cu 0,0,0,0
    //in cazul in care intersectia a*b este reprezentata de multimea vida)
    if(se_intersecteaza(a,b)==1)
        ab=intersectie(a,b);
    else
        init(ab);


    //Se calculeaza a*c (sau se se initializeaza cu 0,0,0,0
    //in cazul in care intersectia a*c este reprezentata de multimea vida)
    if(se_intersecteaza(a,c)==1)
        ac=intersectie(a,c);
    else
        init(ac);


    //Se calculeaza b*c (sau se se initializeaza cu 0,0,0,0
    //in cazul in care intersectia b*c este reprezentata de multimea vida)
    if(se_intersecteaza(b,c)==1)
        bc=intersectie(b,c);
    else
        init(bc);

    //Se calculeaza a*b*c = (a*b)*c (sau se se initializeaza cu 0,0,0,0
    //in cazul in care intersectia a*b*c este reprezentata de multimea vida)
    if(se_intersecteaza(ab,c)==1)
        abc=intersectie(ab,c);
    else
        init(abc);

    //Se afiseaza raspunsul folosind Principiul Includerii si Excluderii
    fout<<(arie(a)+arie(b)+arie(c)-arie(ab)-arie(ac)-arie(bc)+arie(abc))<<' '<<(perimetru(a)+perimetru(b)+perimetru(c)-perimetru(ab)-perimetru(ac)-perimetru(bc)+perimetru(abc))<<'\n';

    //Inchiderea fisierelor de intrare si iesire
    fin.close();
    fout.close();
    return 0;
}