给个错误代码 排个序,然后依次遍历( 开始还感觉很对,但是后面想到一组反例 )
采用
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;
}