传送门
题目大意:你的 任务是在一个n*n的棋盘上放置n个车,使n个车不能相互攻击(既都不同行也不同列),每个车都必须在一定的矩形范围内放置,输入四个值,分别为左上角和右下角的横纵坐标。按照输入顺序输出车的放置位置。
解题思路:
每个车的行和列没有 关系,也就可以分别讨论行和列。单独看行,就变成了一维问题,1-n范围内放置n个物品,每个物品都有自己的范围。贪心法。优先给结束早的区间安排位置即可。将横纵位置分别保存在新数组中,按照输出顺序保存。
AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
struct JU
{
int num, l, r;
bool operator< (JU a)const
{
if(this->r == a.r) return this->l < a.l;
return this->r < a.r;
}
}X[5050], Y[5050];
int cmp(JU x, JU y)
{
if(x.r==y.r) return x.l<y.l;
return x.r<y.r;
}
int A[5050], L[5050], R[5050];
int main()
{
int n;
while(scanf("%d", &n)!= EOF && n)
{
for(int i=0; i<n; i++)
{
scanf("%d%d%d%d", &X[i].l, &Y[i].l, &X[i].r, &Y[i].r);
X[i].num = i;
Y[i].num = i;
}
sort(X, X+n);
memset(A, 0, sizeof(A));
bool flag = true;
for(int i=0; i<n; i++)
{
bool ok = 0;
for(int j=X[i].l; j<= X[i].r; j++)
{
if(!A[j])
{
R[X[i].num] = j;
A[j] = 1;
ok = 1;
break;
}
}
if(!ok)
{
flag = false;
break;
}
}
sort(Y, Y+n);
memset(A, 0, sizeof(A));
for(int i=0; i<n; i++)
{
bool ok = 0;
for(int j=Y[i].l; j<= Y[i].r; j++)
{
if(!A[j])
{
L[Y[i].num] = j;
A[j] = 1;
ok = 1;
break;
}
}
if(!ok)
{
flag = false;
break;
}
}
if(!flag) printf("IMPOSSIBLE\n");
else
{
for(int i=0; i<n; i++) printf("%d %d\n", R[i], L[i]);
}
}
return 0;
}