Advertisement
Tucancitto

Proiect AF - Aria și perimetrul reuniunii a trei dreptunghiuri

Jan 2nd, 2021 (edited)
77
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.97 KB | None | 0 0
  1. // https://www.infoarena.ro/problema/reuniune
  2. // Se citesc coordonatele a trei dreptunghiuri.
  3. // Calculati aria si perimetrul reuniunii celor trei dreptunghiuri.
  4.  
  5. #include <iostream>
  6. #include <fstream>
  7. using namespace std;
  8.  
  9. struct Dreptunghi
  10. {
  11.     int x1, y1, x2, y2; //(x1, y1) reprezinta coordonatele coltului stanga-jos, iar (x2, y2) reprezinta coordonatele coltului dreapta-sus
  12.                         // x1 <= x2 si y1 <= y2
  13. };
  14.  
  15. void Citire(Dreptunghi& D1, Dreptunghi& D2, Dreptunghi& D3)
  16. {
  17.     ifstream fin("reuniune.in");
  18.  
  19.     fin >> D1.x1 >> D1.y1 >> D1.x2 >> D1.y2; //Laturile primului dreptunghi sunt D1.x2 - D1.x1 si D1.y2 - D1.y1
  20.     fin >> D2.x1 >> D2.y1 >> D2.x2 >> D2.y2;
  21.     fin >> D3.x1 >> D3.y1 >> D3.x2 >> D3.y2;
  22.  
  23.     fin.close();
  24. }
  25.  
  26. int Perimetru(Dreptunghi A)
  27. {
  28.     return 2 * (A.x2 - A.x1 + A.y2 - A.y1); // Perimetrul unui dreptunghi este 2*(Latime + Lungime)
  29. }
  30.  
  31. int Arie(Dreptunghi A)
  32. {
  33.     return (A.x2 - A.x1) * (A.y2 - A.y1); // Aria unui dreptunghi este Latime*Lungime
  34. }
  35.  
  36. Dreptunghi intersectieDreptunghiuri(Dreptunghi A, Dreptunghi B)
  37. {
  38.     /*
  39.     Determinam colturile stanga-jos si dreapta-sus ale dreptunghiului C pe baza suprapunerii dreptunghiurilor A si B.
  40.  
  41.     ---Pentru coltul stanga-jos:
  42.         C.x1 = maximul dintre abscisele lui A si B ale coltului stanga-jos, adica max(A.x1, B.x1)
  43.         C.y1 = maximul dintre ordonatele lui A si B ale coltului stanga-jos, adica max(A.y1, B.y1)
  44.  
  45.     ---Pentru coltul dreapta-sus:
  46.         C.x2 = minimul dintre abscisele lui A si B ale coltului dreapta-sus = min(A.x2, B.x2)
  47.         C.y1 = minimul dintre abscisele lui A si B ale coltului dreapta-sus = min(A.y2, B.y2)
  48.     */
  49.     Dreptunghi C = { 0 };
  50.  
  51.     C.x1 = max(A.x1, B.x1);
  52.     C.y1 = max(A.y1, B.y1);
  53.     C.x2 = min(A.x2, B.x2);
  54.     C.y2 = min(A.y2, B.y2);
  55.  
  56.     //Daca cele doua dreptunghiuri nu se suprapun, atunci C va avea coordonatele pentru cele doua colturi in (0,0) si (0,0).
  57.  
  58.     if (C.x2 < C.x1 || C.y2 < C.y1)
  59.         C.x1 = C.x2 = C.y1 = C.y2 = 0;
  60.  
  61.     return C;
  62. }
  63.  
  64. void Calcul(Dreptunghi D1, Dreptunghi D2, Dreptunghi D3, int& Ar, int& Per)
  65. {
  66.     //Adunam ariile celor 3 dreptunghiuri
  67.     Ar = Arie(D1) + Arie(D2) + Arie(D3);
  68.     //Scadem ariile suprapunerilor (D1,D2), (D1,D3) si (D2,D3)
  69.     Ar -= (Arie(intersectieDreptunghiuri(D1, D2)) + Arie(intersectieDreptunghiuri(D1, D3)) + Arie(intersectieDreptunghiuri(D2, D3)));
  70.     //Adaugam aria care contine intersectia celor 3 dreptunghiuri
  71.     Ar += Arie(intersectieDreptunghiuri(D1, intersectieDreptunghiuri(D2, D3)));
  72.  
  73.     Per += Perimetru(D1) + Perimetru(D2) + Perimetru(D3);
  74.     Per -= (Perimetru(intersectieDreptunghiuri(D1, D2)) + Perimetru(intersectieDreptunghiuri(D1, D3)) + Perimetru(intersectieDreptunghiuri(D2, D3)));
  75.     Per += Perimetru(intersectieDreptunghiuri(D1, intersectieDreptunghiuri(D2, D3)));
  76. }
  77.  
  78. int main()
  79. {
  80.     ofstream fout("reuniune.out");
  81.  
  82.     Dreptunghi D1, D2, D3;
  83.     int Ar = 0, Per = 0;
  84.  
  85.     Citire(D1, D2, D3);
  86.     Calcul(D1, D2, D3, Ar, Per);
  87.  
  88.     fout << "Aria suprafetei este: " << Ar << " \n";
  89.     fout << "Perimetrul suprafetei este: " << Per;
  90.     fout.close();
  91.     return 0;
  92. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement