普通的贪心题。
虽然图是二维的,但可以把横向和纵向分开处理。
将区间按右端点排序,然后从区间左端点到右端点找第一个空位置放棋子即可。
1 /*by SilverN*/ 2 #include<algorithm> 3 #include<iostream> 4 #include<cstring> 5 #include<cstdio> 6 #include<cmath> 7 #include<vector> 8 using namespace std; 9 const int mxn=5010; 10 int read(){ 11 int x=0,f=1;char ch=getchar(); 12 while(ch<'0' || ch>'9'){if(ch=='-')f=-1;ch=getchar();} 13 while(ch>='0' && ch<='9'){x=x*10+ch-'0';ch=getchar();} 14 return x*f; 15 } 16 struct rec{ 17 int x1,x2; 18 int y1,y2; 19 int id; 20 }a[mxn]; 21 int cmpx(rec a,rec b){return a.x2<b.x2;} 22 int cmpy(rec a,rec b){return a.y2<b.y2;} 23 int n; 24 int px[mxn],py[mxn]; 25 bool vis[mxn]; 26 bool flag=0; 27 void SovX(){ 28 memset(vis,0,sizeof vis); 29 int tmp; 30 for(int i=1;i<=n;i++){ 31 tmp=a[i].x1; 32 while(vis[tmp])tmp++; 33 if(tmp>a[i].x2)flag=0; 34 vis[tmp]=1; 35 px[a[i].id]=tmp; 36 } 37 return; 38 } 39 void SovY(){ 40 memset(vis,0,sizeof vis); 41 int tmp; 42 for(int i=1;i<=n;i++){ 43 tmp=a[i].y1; 44 while(vis[tmp])tmp++; 45 if(tmp>a[i].y2)flag=0; 46 vis[tmp]=1; 47 py[a[i].id]=tmp; 48 } 49 return; 50 } 51 52 int main(){ 53 int i,j; 54 while(scanf("%d",&n) && n){ 55 flag=1; 56 for(i=1;i<=n;i++){ 57 a[i].x1=read();a[i].y1=read(); 58 a[i].x2=read();a[i].y2=read(); 59 a[i].id=i; 60 } 61 sort(a+1,a+n+1,cmpx); 62 SovX(); 63 sort(a+1,a+n+1,cmpy); 64 SovY(); 65 if(!flag)printf("IMPOSSIBLE "); 66 else{ 67 for(i=1;i<=n;i++){ 68 printf("%d %d ",px[i],py[i]); 69 } 70 } 71 } 72 return 0; 73 }