#include <iostream> #include <list> #include <cstdio> #include <vector> #include <algorithm> using namespace std; struct tribe{ int x1; int x2; int y1; int y2; }; bool compare(const tribe& a, const tribe& b) { return a.x1<b.x1 || ( !(a.x1>b.x1) && a.x2<b.x2) || (( !(a.x1>b.x1) && !(a.x2<b.x2)) && a.y1<b.y1); }; tribe kraj, patrz, byl; list <tribe> tab; vector <tribe> last; int n; int main() { scanf("%d", &n); for(int z=0;z<n;z++) { scanf("%d %d %d %d", &kraj.x1, &kraj.x2, &kraj.y1, &kraj.y2); tab.push_back(kraj); } list<tribe>::iterator iter=tab.begin(); list<tribe>::iterator na=tab.begin(); na++; kraj=*iter; byl=*iter; while(!tab.empty()) { while(na!=tab.end()) { patrz=*na; if( patrz.x1<kraj.x2 && patrz.x2>kraj.x1 && patrz.y1<kraj.y2 && patrz.y2>kraj.y1 ) { kraj.x1=min(kraj.x1, patrz.x1); kraj.x2=max(kraj.x2, patrz.x2); kraj.y1=min(kraj.y1, patrz.y1); kraj.y2=max(kraj.y2, patrz.y2); na=tab.erase(na); } else na++; } if((kraj.x1==byl.x1 && kraj.x2==byl.x2) && (kraj.y1==byl.y1 && kraj.y2==byl.y2)) { last.push_back(kraj); iter=tab.erase(iter); if(!tab.empty()) { kraj=*iter; byl=*iter; na=iter; na++; } } else { byl.x1=kraj.x1; byl.x2=kraj.x2; byl.y1=kraj.y1; byl.y2=kraj.y2; na=iter; na++; } } sort(last.begin(), last.end(), compare); n=last.size(); printf("%d\n", n); for(unsigned int q=0; q<last.size();q++) printf("%d %d %d %d\n", last[q].x1, last[q].x2, last[q].y1, last[q].y2); 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 | #include <iostream> #include <list> #include <cstdio> #include <vector> #include <algorithm> using namespace std; struct tribe{ int x1; int x2; int y1; int y2; }; bool compare(const tribe& a, const tribe& b) { return a.x1<b.x1 || ( !(a.x1>b.x1) && a.x2<b.x2) || (( !(a.x1>b.x1) && !(a.x2<b.x2)) && a.y1<b.y1); }; tribe kraj, patrz, byl; list <tribe> tab; vector <tribe> last; int n; int main() { scanf("%d", &n); for(int z=0;z<n;z++) { scanf("%d %d %d %d", &kraj.x1, &kraj.x2, &kraj.y1, &kraj.y2); tab.push_back(kraj); } list<tribe>::iterator iter=tab.begin(); list<tribe>::iterator na=tab.begin(); na++; kraj=*iter; byl=*iter; while(!tab.empty()) { while(na!=tab.end()) { patrz=*na; if( patrz.x1<kraj.x2 && patrz.x2>kraj.x1 && patrz.y1<kraj.y2 && patrz.y2>kraj.y1 ) { kraj.x1=min(kraj.x1, patrz.x1); kraj.x2=max(kraj.x2, patrz.x2); kraj.y1=min(kraj.y1, patrz.y1); kraj.y2=max(kraj.y2, patrz.y2); na=tab.erase(na); } else na++; } if((kraj.x1==byl.x1 && kraj.x2==byl.x2) && (kraj.y1==byl.y1 && kraj.y2==byl.y2)) { last.push_back(kraj); iter=tab.erase(iter); if(!tab.empty()) { kraj=*iter; byl=*iter; na=iter; na++; } } else { byl.x1=kraj.x1; byl.x2=kraj.x2; byl.y1=kraj.y1; byl.y2=kraj.y2; na=iter; na++; } } sort(last.begin(), last.end(), compare); n=last.size(); printf("%d\n", n); for(unsigned int q=0; q<last.size();q++) printf("%d %d %d %d\n", last[q].x1, last[q].x2, last[q].y1, last[q].y2); return 0; } |