#include <iostream> #include <algorithm> #include <vector> using namespace std; int tab[100005][4]; int n; vector< vector<int> > wektor; vector<int> prostokat; bool przecinaja(int y, int x1, int x2, int x, int y1, int y2) { if((y1 < y) && (y<y2) && (x1 < x) && (x < x2)) { return true; } else { return false; } } bool zawiera(int ax1, int ax2, int ay1, int ay2, int bx1, int bx2, int by1, int by2) { if((ax1 <= bx1) && (ax2 >= bx2) && (ay1 <= by2) && (ay2 >= by2)) { return true; } else { return false; } } int main() { ios_base::sync_with_stdio(0); cin >> n; for(int i = 0; i < n; i++) { cin >> tab[i][0] >> tab[i][1] >> tab[i][2] >> tab[i][3]; } for(int i = 0; i < n; i++) { //cout <<"Analizuje prostokat "<<i<<"\n"; if(tab[i][0] != -1) { for(int j = 0; j < n; j++) { if((i != j) && (tab[j][0] != -1)) { if(przecinaja(tab[i][0], tab[i][2], tab[i][3], tab[j][2], tab[j][0], tab[j][1]) || przecinaja(tab[i][0], tab[i][2], tab[i][3], tab[j][3], tab[j][0], tab[j][1]) || przecinaja(tab[i][1], tab[i][2], tab[i][3], tab[j][2], tab[j][0], tab[j][1]) || przecinaja(tab[i][1], tab[i][2], tab[i][3], tab[j][3], tab[j][0], tab[j][1]) || przecinaja(tab[j][0], tab[j][2], tab[j][3], tab[i][2], tab[i][0], tab[i][1]) || przecinaja(tab[j][0], tab[j][2], tab[j][3], tab[i][3], tab[i][0], tab[i][1]) || przecinaja(tab[j][1], tab[j][2], tab[j][3], tab[i][2], tab[i][0], tab[i][1]) || przecinaja(tab[j][1], tab[j][2], tab[j][3], tab[i][3], tab[i][0], tab[i][1])) { //cout <<"Prostokaty "<<i<<" i "<<j<<" przecinaja sie\n"; tab[i][0] = min(tab[i][0], tab[j][0]); tab[i][1] = max(tab[i][1], tab[j][1]); tab[i][2] = min(tab[i][2], tab[j][2]); tab[i][3] = max(tab[i][3], tab[j][3]); //cout <<"Nowy prostokat: "<< tab[i][0] <<" "<<tab[i][1]<<" "<<tab[i][2]<<" "<<tab[i][3]<<"\n"; tab[j][0] = -1; --i; break; } if(zawiera(tab[i][0], tab[i][1], tab[i][2], tab[i][3], tab[j][0], tab[j][1], tab[j][2], tab[j][3])) { tab[j][0] = -1; } } } } } int wynik = 0; for(int i = 0; i < n; i++) { if(tab[i][0] != -1) { wynik++; } } cout << wynik <<"\n"; for(int i = 0; i < n; i++) { if(tab[i][0] != -1) { prostokat.clear(); for(int j = 0; j < 4; j++) { prostokat.push_back(tab[i][j]); } wektor.push_back(prostokat); //cout << tab[i][0] <<" "<<tab[i][1]<<" "<<tab[i][2]<<" "<<tab[i][3]<<"\n"; } } sort(wektor.begin(), wektor.end()); for(int i = 0; i < wektor.size(); i++) { cout << wektor[i][0] <<" "<< wektor[i][1]<<" "<<wektor[i][2]<<" "<<wektor[i][3]<<"\n"; } 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 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <iostream> #include <algorithm> #include <vector> using namespace std; int tab[100005][4]; int n; vector< vector<int> > wektor; vector<int> prostokat; bool przecinaja(int y, int x1, int x2, int x, int y1, int y2) { if((y1 < y) && (y<y2) && (x1 < x) && (x < x2)) { return true; } else { return false; } } bool zawiera(int ax1, int ax2, int ay1, int ay2, int bx1, int bx2, int by1, int by2) { if((ax1 <= bx1) && (ax2 >= bx2) && (ay1 <= by2) && (ay2 >= by2)) { return true; } else { return false; } } int main() { ios_base::sync_with_stdio(0); cin >> n; for(int i = 0; i < n; i++) { cin >> tab[i][0] >> tab[i][1] >> tab[i][2] >> tab[i][3]; } for(int i = 0; i < n; i++) { //cout <<"Analizuje prostokat "<<i<<"\n"; if(tab[i][0] != -1) { for(int j = 0; j < n; j++) { if((i != j) && (tab[j][0] != -1)) { if(przecinaja(tab[i][0], tab[i][2], tab[i][3], tab[j][2], tab[j][0], tab[j][1]) || przecinaja(tab[i][0], tab[i][2], tab[i][3], tab[j][3], tab[j][0], tab[j][1]) || przecinaja(tab[i][1], tab[i][2], tab[i][3], tab[j][2], tab[j][0], tab[j][1]) || przecinaja(tab[i][1], tab[i][2], tab[i][3], tab[j][3], tab[j][0], tab[j][1]) || przecinaja(tab[j][0], tab[j][2], tab[j][3], tab[i][2], tab[i][0], tab[i][1]) || przecinaja(tab[j][0], tab[j][2], tab[j][3], tab[i][3], tab[i][0], tab[i][1]) || przecinaja(tab[j][1], tab[j][2], tab[j][3], tab[i][2], tab[i][0], tab[i][1]) || przecinaja(tab[j][1], tab[j][2], tab[j][3], tab[i][3], tab[i][0], tab[i][1])) { //cout <<"Prostokaty "<<i<<" i "<<j<<" przecinaja sie\n"; tab[i][0] = min(tab[i][0], tab[j][0]); tab[i][1] = max(tab[i][1], tab[j][1]); tab[i][2] = min(tab[i][2], tab[j][2]); tab[i][3] = max(tab[i][3], tab[j][3]); //cout <<"Nowy prostokat: "<< tab[i][0] <<" "<<tab[i][1]<<" "<<tab[i][2]<<" "<<tab[i][3]<<"\n"; tab[j][0] = -1; --i; break; } if(zawiera(tab[i][0], tab[i][1], tab[i][2], tab[i][3], tab[j][0], tab[j][1], tab[j][2], tab[j][3])) { tab[j][0] = -1; } } } } } int wynik = 0; for(int i = 0; i < n; i++) { if(tab[i][0] != -1) { wynik++; } } cout << wynik <<"\n"; for(int i = 0; i < n; i++) { if(tab[i][0] != -1) { prostokat.clear(); for(int j = 0; j < 4; j++) { prostokat.push_back(tab[i][j]); } wektor.push_back(prostokat); //cout << tab[i][0] <<" "<<tab[i][1]<<" "<<tab[i][2]<<" "<<tab[i][3]<<"\n"; } } sort(wektor.begin(), wektor.end()); for(int i = 0; i < wektor.size(); i++) { cout << wektor[i][0] <<" "<< wektor[i][1]<<" "<<wektor[i][2]<<" "<<wektor[i][3]<<"\n"; } return 0; } |