#include<cstdio> #include<algorithm> #include<vector> #define MAXN 100003 using namespace std; struct pro{ int x[2]; int y[2]; }; int n; pro tab[MAXN]; pro pom; vector<pro> V; bool aktywny[MAXN]; int ilosc; bool maja_wspolne(const int &a, const int &b){ pom.x[0] = max(tab[a].x[0],tab[b].x[0]); pom.x[1] = min(tab[a].x[1],tab[b].x[1]); pom.y[0] = max(tab[a].y[0],tab[b].y[0]); pom.y[1] = min(tab[a].y[1],tab[b].y[1]); if(pom.x[0] >= pom.x[1])return false; if(pom.y[0] >= pom.y[1])return false; return true; } bool cmp(const pro &a,const pro &b){ if(a.x[0] < b.x[0])return true; else if(a.x[0] == b.x[0]){ if(a.x[1] < b.x[1])return true; else if(a.x[1] == b.x[1]){ if(a.y[0] < b.y[0])return true; else if(a.y[0] == b.y[0]){ if(a.y[1] < b.y[1])return true; } } } return false; } int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d %d %d %d",&pom.x[0],&pom.x[1],&pom.y[0],&pom.y[1]); tab[i].x[0] = min(pom.x[0],pom.x[1]); tab[i].x[1] = max(pom.x[0],pom.x[1]); tab[i].y[0] = min(pom.y[0],pom.y[1]); tab[i].y[1] = max(pom.y[0],pom.y[1]); aktywny[i] = 1; } for(int i=0;i<n;i++){ if(aktywny[i] == 1){ for(int j=0;j<n;j++){ if((j != i)&&(aktywny[j] == 1)&&(maja_wspolne(i,j))){ aktywny[j] = 0; tab[i].x[0] = min(tab[j].x[0],tab[i].x[0]); tab[i].x[1] = max(tab[j].x[1],tab[i].x[1]); tab[i].y[0] = min(tab[j].y[0],tab[i].y[0]); tab[i].y[1] = max(tab[j].y[1],tab[i].y[1]); j = (-1); } } } } for(int i=0;i<n;i++){ if(aktywny[i] == 1){ ilosc++; V.push_back(tab[i]); } } sort(V.begin(),V.end(),cmp); printf("%d\n",ilosc); for(int i=0;i<V.size();i++){ printf("%d %d %d %d\n",V[i].x[0],V[i].x[1],V[i].y[0],V[i].y[1]); } 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 | #include<cstdio> #include<algorithm> #include<vector> #define MAXN 100003 using namespace std; struct pro{ int x[2]; int y[2]; }; int n; pro tab[MAXN]; pro pom; vector<pro> V; bool aktywny[MAXN]; int ilosc; bool maja_wspolne(const int &a, const int &b){ pom.x[0] = max(tab[a].x[0],tab[b].x[0]); pom.x[1] = min(tab[a].x[1],tab[b].x[1]); pom.y[0] = max(tab[a].y[0],tab[b].y[0]); pom.y[1] = min(tab[a].y[1],tab[b].y[1]); if(pom.x[0] >= pom.x[1])return false; if(pom.y[0] >= pom.y[1])return false; return true; } bool cmp(const pro &a,const pro &b){ if(a.x[0] < b.x[0])return true; else if(a.x[0] == b.x[0]){ if(a.x[1] < b.x[1])return true; else if(a.x[1] == b.x[1]){ if(a.y[0] < b.y[0])return true; else if(a.y[0] == b.y[0]){ if(a.y[1] < b.y[1])return true; } } } return false; } int main(){ scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d %d %d %d",&pom.x[0],&pom.x[1],&pom.y[0],&pom.y[1]); tab[i].x[0] = min(pom.x[0],pom.x[1]); tab[i].x[1] = max(pom.x[0],pom.x[1]); tab[i].y[0] = min(pom.y[0],pom.y[1]); tab[i].y[1] = max(pom.y[0],pom.y[1]); aktywny[i] = 1; } for(int i=0;i<n;i++){ if(aktywny[i] == 1){ for(int j=0;j<n;j++){ if((j != i)&&(aktywny[j] == 1)&&(maja_wspolne(i,j))){ aktywny[j] = 0; tab[i].x[0] = min(tab[j].x[0],tab[i].x[0]); tab[i].x[1] = max(tab[j].x[1],tab[i].x[1]); tab[i].y[0] = min(tab[j].y[0],tab[i].y[0]); tab[i].y[1] = max(tab[j].y[1],tab[i].y[1]); j = (-1); } } } } for(int i=0;i<n;i++){ if(aktywny[i] == 1){ ilosc++; V.push_back(tab[i]); } } sort(V.begin(),V.end(),cmp); printf("%d\n",ilosc); for(int i=0;i<V.size();i++){ printf("%d %d %d %d\n",V[i].x[0],V[i].x[1],V[i].y[0],V[i].y[1]); } return 0; } |