比较简单的一道题,关键在于抓住一点:可以对行以及队列进行分开处理,行列的处理彼此之间是没有影响的。每次都选出满足条件的右边界最小的点,如果满足要求就继续下一轮的递归求解,如果不满足要求返回false结束即可,具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
#include<functional>
using namespace std;
const int maxn = 5010;
int x1[maxn], y[maxn], x2[maxn], y2[maxn];
int resx[maxn], resy[maxn];
int n;
bool solve(int s[],int e[],int ans[]){
fill(ans, ans + n, -1);
for (int i = 1; i <= n; i++){
int minb = n+1,ind=-1;
for (int j = 0; j < n; j++){
if (ans[j] < 0 && e[j] < minb&&i >= s[j]){
minb = e[j];
ind = j;
}
}
if (ind<0 || i>minb) return false;
ans[ind] = i;
}
return true;
}
int main(){
while (cin >> n){
if (n == 0) break;
for (int i = 0; i < n; i++){
cin >> x1[i] >> y[i] >> x2[i] >> y2[i];
}
if (solve(x1, x2, resx) && solve(y, y2, resy)){
for (int i = 0; i < n;i++)
cout << resx[i] << " " << resy[i]<<endl;
}
else{
cout << "IMPOSSIBLE\n";
}
}
return 0;
}