Uva11134

#include<bits/stdc++.h>

#define inf 0x3f3f3f3f

const int maxn=5000;

using namespace std;

int n;

struct rook{
        int x1,y1;
        int x2,y2;
        int id;
        int resx,resy;
        int size(){
                return abs(x1 - x2) * abs(x1 - x2) + abs(y1 - y2) * abs(y1 - y2);
        }
        int width(){
                return abs(x1 - x2);
        }
        int len(){
                return abs(y1 - y2);
        }
}rooks[maxn+10];

int flagx[maxn+10];

int flagy[maxn+10];

bool cmpx(rook a, rook b){
        /*if(a.width() == b.width()){
              return a.x1 < b.x1;      
        }
        return a.width() < b.width();*/
        //刚开始想错了,这么去贪心,是错的。
                                       /* 反例
                                        * 1111
                                        * 1
                                        *  1
                                        *   1
                                        *    11
                                        */
        if(a.x2 == b.x2){
                return a.x1 < b.x1;
        }
        return a.x2 < b.x2;
}
bool cmpy(rook a, rook b){
        /*if(a.len() == b.len()){
              return a.y1 < b.y1;
        }
        return a.len() < b.len();*/
        if(a.y2 == b.y2){
                return a.y1 < b.y1;
        }
        return a.y2 < b.y2;
}
bool cmp1(rook a, rook b){
        return a.id < b.id;
}

int main()
{
        while(scanf("%d",&n)!=EOF&&n){
                int res = 0;
                memset(flagx, 0, sizeof(flagx));
                memset(flagy, 0, sizeof(flagy));
                for(int i = 0; i < n; ++i){
                        scanf("%d%d%d%d",&rooks[i].x1,&rooks[i].y1,&rooks[i].x2,&rooks[i].y2);
                        rooks[i].id = i;
                }
                sort(rooks, rooks + n, cmpx);
                for(int i = 0; i < n; ++i){
                        int flag = 0;
                        for(int j = rooks[i].x1; j <= rooks[i].x2; ++j){
                                if(!flagx[j]){
                                        flagx[j] = 1;
                                        rooks[i].resx = j;
                                        flag = 1;
                                        break;
                                }
                        }
                        if(!flag){
                                res = 1;
                                break;
                        }
                }
                if(!res){
                        sort(rooks, rooks + n, cmpy);
                        for(int i = 0; i < n; ++i){
                                int flag = 0;
                                for(int j = rooks[i].y1; j <= rooks[i].y2; ++j){
                                        if(!flagy[j]){
                                                flagy[j] = 1;
                                                rooks[i].resy = j;
                                                flag = 1;
                                                break;
                                        }
                                }
                                if(!flag){
                                        res = 1;
                                        break;
                                }
                        }
                }
                if(res){
                        printf("IMPOSSIBLE\n");
                } else {
                        sort(rooks, rooks + n, cmp1);
                        for(int i = 0; i < n; ++i){
                                printf("%d %d\n",rooks[i].resx,rooks[i].resy);
                        }
                }
        }
    return 0;
}

 

转载于:https://www.cnblogs.com/GeniusYang/p/6695368.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值