// Plemiona.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <list>
#include <tuple>
using namespace std;
class plemie
{
public:
int x1, x2, y1, y2;
plemie (int x_a, int x_b, int y_a, int y_b)
{
x1 = min(x_a, x_b); x2 = max(x_a, x_b);
y1 = min(y_a, y_b); y2 = max(y_a, y_b);
}
void przylacz (const plemie & other)
{
x1 = min(x1, other.x1); x2 = max(x2, other.x2);
y1 = min(y1, other.y1); y2 = max(y2, other.y2);
}
bool sprawdz_przeciecie (const plemie & other)
{
if(x2 <= other.x1 || x1 >= other.x2 || y2 <= other.y1 || y1 >= other.y2)
return false;
else return true;
}
bool operator < (const plemie & other)
{ return tie(x1,x2,y1,y2) < tie(other.x1, other.x2, other.y1, other.y2);}
};
void dodaj_plemie (plemie nowe_plemie, list<plemie> & plemiona)
{
bool byla_zmiana = true;
while(byla_zmiana)
{
byla_zmiana = false;
list<plemie>::iterator it = plemiona.begin();
while ( it != plemiona.end())
{
if (nowe_plemie.sprawdz_przeciecie(*it) == true)
{
byla_zmiana = true;
nowe_plemie.przylacz((*it));
it = plemiona.erase(it);
}
else ++it;
}
}
plemiona.push_front(nowe_plemie);
}
int main()
{
int ile_plemion;
cin >> ile_plemion;
list<plemie> plemiona; // kazde plemie (el. wektora) opisane jest 4 liczbami: x_min, x_max, y_min, y_max - granice zajmowanego obszaru
for (int ii=0; ii< ile_plemion; ii++)
{
int x1, x2, y1, y2;
cin >> x1 >> x2 >> y1 >> y2;
plemie nowe_plemie = plemie(x1, x2, y1, y2);
dodaj_plemie(nowe_plemie, plemiona);
}
plemiona.sort();
cout << plemiona.size() << endl;
for (list<plemie>::iterator it = plemiona.begin(); it != plemiona.end(); ++it)
cout << it->x1 << " " << it->x2 << " " << it->y1 << " " << it->y2 << endl;
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | // Plemiona.cpp : Defines the entry point for the console application. // #include <iostream> #include <list> #include <tuple> using namespace std; class plemie { public: int x1, x2, y1, y2; plemie (int x_a, int x_b, int y_a, int y_b) { x1 = min(x_a, x_b); x2 = max(x_a, x_b); y1 = min(y_a, y_b); y2 = max(y_a, y_b); } void przylacz (const plemie & other) { x1 = min(x1, other.x1); x2 = max(x2, other.x2); y1 = min(y1, other.y1); y2 = max(y2, other.y2); } bool sprawdz_przeciecie (const plemie & other) { if(x2 <= other.x1 || x1 >= other.x2 || y2 <= other.y1 || y1 >= other.y2) return false; else return true; } bool operator < (const plemie & other) { return tie(x1,x2,y1,y2) < tie(other.x1, other.x2, other.y1, other.y2);} }; void dodaj_plemie (plemie nowe_plemie, list<plemie> & plemiona) { bool byla_zmiana = true; while(byla_zmiana) { byla_zmiana = false; list<plemie>::iterator it = plemiona.begin(); while ( it != plemiona.end()) { if (nowe_plemie.sprawdz_przeciecie(*it) == true) { byla_zmiana = true; nowe_plemie.przylacz((*it)); it = plemiona.erase(it); } else ++it; } } plemiona.push_front(nowe_plemie); } int main() { int ile_plemion; cin >> ile_plemion; list<plemie> plemiona; // kazde plemie (el. wektora) opisane jest 4 liczbami: x_min, x_max, y_min, y_max - granice zajmowanego obszaru for (int ii=0; ii< ile_plemion; ii++) { int x1, x2, y1, y2; cin >> x1 >> x2 >> y1 >> y2; plemie nowe_plemie = plemie(x1, x2, y1, y2); dodaj_plemie(nowe_plemie, plemiona); } plemiona.sort(); cout << plemiona.size() << endl; for (list<plemie>::iterator it = plemiona.begin(); it != plemiona.end(); ++it) cout << it->x1 << " " << it->x2 << " " << it->y1 << " " << it->y2 << endl; return 0; } |
English