Pagini recente » Cod sursa (job #755680) | Cod sursa (job #2553352) | Cod sursa (job #473128) | Cod sursa (job #1794880) | Cod sursa (job #880294)
Cod sursa(job #880294)
#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;
}