题目大意:在n*n的棋盘上放置n个车,使得任意两辆车不互相攻击,且第i辆车在一个给定的矩形Ri之内
解题思路:每辆车都必须在给定矩形内放置且任意两辆不互相攻击,不互相攻击的话就表示任意两辆车不在同一行和同一列,这样的话,就分别按行和按列扫描,找到符合规则的就放
这里设置一个优先队列,因为要让所有的车都有位置放,就要考虑一下车的摆放顺序的。设第i辆车能摆放的区间为[si,di],则这里的优先规则就为:di小的先放
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
#define maxn 5010
struct node{
int l1, l2, id;
bool operator < (const node &t) const {
if(t.l1 == l1)
return l2 > t.l2;
else
return l1 > t.l1;
}
}n1[maxn], n2[maxn];
int N, ans[maxn][2];
priority_queue<node> q;
bool check(node *arr, int pos) {
int cur = 1;
while(!q.empty())
q.pop();
for(int i = 0; i < N; i++)
q.push(arr[i]);
while(cur <= N) {
node tmp = q.top();
q.pop();
if(tmp.l2 < cur)
return false;
if(tmp.l1 < cur) {
tmp.l1 = cur;
q.push(tmp);
continue;
}
if(tmp.l1 > cur)
return false;
ans[tmp.id][pos] = cur++;
}
return true;
}
int main() {
while(scanf("%d", &N) == 1 && N) {
for(int i = 0; i < N; i++) {
scanf("%d%d%d%d",&n1[i].l1, &n2[i].l1, &n1[i].l2, &n2[i].l2);
n1[i].id = n2[i].id = i;
}
if(check(n1,0) && check(n2,1)) {
for(int i = 0; i < N; i++)
printf("%d %d\n",ans[i][0], ans[i][1]);
}
else
printf("IMPOSSIBLE\n");
}
return 0;
}