uva 11134 Fabled Rooks

  给个错误代码  排个序,然后依次遍历( 开始还感觉很对,但是后面想到一组反例 )

采用 

bool cmp1(node_x a, node_x b) {
    if(a.s == b.s) {
        return a.e < b.e;
    }
    else
        return a.s < b.s;
}

进行排序之后, 然后依次进行选择, 但是后来发现是错的,  大家可以参考参考

证明:

A  xl = 1, xr = 1   B xl = 2, xr = 2  C xl = 1, xr = 3;

经过排序之后, a1 c2 b3  然后a的x坐标为1  c的x坐标为2  到d时会产生不可能,   但是如果a的x为1  b的x为2  c的x为3的话, 这组数据本身是有结果的。

故上面的写法会WA.  正确代码就是用优先队列进行处理即可.  网上很多,我不在多言, 只是给个想法. 



#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int Maxn = 5000 + 10;

int n;

struct node_x{
    int s, e, i;
}X[Maxn];

struct node_y{
    int s, e, i;
}Y[Maxn];

int x[Maxn], y[Maxn];

bool cmp1(node_x a, node_x b) {
    if(a.s == b.s) {
        return a.e < b.e;
    }
    else
        return a.s < b.s;
}

bool cmp2(node_y a, node_y b) {
      if(a.s == b.s) {
        return a.e < b.e;
    }
    else
        return a.s < b.s;
}

void ini() {
    for(int i=0; i<n; ++i) {
        X[i].i = i;
        Y[i].i = i;
    }
}

bool find_x() {
    for(int i=1; i<=n; ++i) {
        if(X[i-1].s > i ||X[i-1].e < i)
            return true;
        x[X[i-1].i] = i;
    }
    return false;
}

bool find_y() {
     for(int i=1; i<=n; ++i) {
        if(Y[i-1].s > i ||Y[i-1].e < i)
            return true;
        y[Y[i-1].i] = i;
    }
    return false;
    }

int main(void) {
    while(scanf("%d",&n)==1&&n) {
     for(int i=0; i<n; ++i) {
        scanf("%d%d%d%d",&X[i].s,&Y[i].s,&X[i].e,&Y[i].e);
        X[i].i = Y[i].i = i;
     }
    //将其分为x y2个问题
     sort(X, X+n, cmp1);
     sort(Y, Y+n, cmp2);
     bool flag = true;
     if(find_x()||find_y())
      {
        flag = false;
      }
     if(flag) {
        for(int i=0; i<n; ++i) {
            printf("%d %d\n",x[i],y[i]);
        }
     }
     else
        cout<<"IMPOSSIBLE"<<endl;
    }
    return 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值