行和列分别考虑,找出右端点中最靠左,左端点最靠右的,必然是最优方案
#include<iostream> #include<vector> #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; struct Rectangle { int x1,y1,x2,y2; int x,y; int order; } rec[5010]; int n; int row[5010],col[5010]; /*void Search(int num) { if(flag==0) return; if(num==n) { flag=0; tot++; for(int i=0; i<n; i++) { printf("%d %d\n",poi[i].x,poi[i].y); } } else { for(int i=0; i<n; i++) { for(int j=rec[num].x1; j<=rec[num].x2; j++) { if(!visit[0][j]) { visit[0][j]=1; for(int k=rec[num].y1; k<=rec[num].y2; k++) { if(!visit[1][k]) { poi[num].x=j; poi[num].y=k; visit[1][k]=1; Search(num+1); visit[1][k]=0; } /* poi[num].x=j; poi[num].y=k; int ok=1; for(int j=0; j<num; j++) { if(poi[num].x==poi[j].x||poi[num].y==poi[j].y) { ok=0; break; } }* / if(ok) Search(num+1); } visit[0][j]=0; } } } } }*/ bool cmp1(Rectangle a,Rectangle b) { if(a.x2!=b.x2) return a.x2<b.x2; return a.x1>=b.x1; } bool cmp2(Rectangle a,Rectangle b) { if(a.y2!=b.y2) return a.y2<b.y2; return a.y1>=b.y1; } bool cmp3(Rectangle a,Rectangle b) { return a.order<b.order; } bool Col() { sort(rec,rec+n,cmp1); for(int i=0;i<n;i++) { bool flag=false; for(int j=rec[i].x1;j<=rec[i].x2;j++) { if(col[j]==0) { col[j]=1; flag=true; rec[i].x=j; break; } } if(!flag) { return false; } } return true; } bool Row() { sort(rec,rec+n,cmp2); for(int i=0;i<n;i++) { bool flag=false; for(int j=rec[i].y1;j<=rec[i].y2;j++) { if(row[j]==0) { row[j]=1; flag=true; rec[i].y=j; break; } } if(!flag) { return false; } } return true; } int main() { while(scanf("%d",&n)&&n!=0) { memset(col,0,sizeof(col)); memset(row,0,sizeof(row)); for(int i=0; i<n; i++) { scanf("%d%d%d%d",&rec[i].x1,&rec[i].y1,&rec[i].x2,&rec[i].y2); rec[i].order=i; } if(!Col()) { puts("IMPOSSIBLE1"); continue; } if(!Row()) { puts("IMPOSSIBLE2"); continue; } sort(rec,rec+n,cmp3); for(int i=0;i<n;i++) { printf("%d %d\n",rec[i].x,rec[i].y); } } return 0; }