3 1 1 3 3 1 1 3 3 2 2 2 2
// UVa 11134 // 问题分解 /* 横与竖互不影响,所以将它们分开进行计算,这样我们将 二维转化成为了一维,然后成为了区间选点类似的问题,贪心法进行求解。 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 5000 + 5; int X0[maxn], X1[maxn], Y0[maxn], Y1[maxn], rec[maxn], vis[maxn]; int r[maxn], c[maxn]; bool cmp1(int a, int b) { // 关于x的排序 if (X1[a] != X1[b]) return X1[a] < X1[b]; return X0[a] > X0[b]; } bool cmp2(int a, int b) { // 关于y的排序 if (Y1[a] != Y1[b]) return Y1[a] < Y1[b]; return Y0[a] > Y0[b]; } int main() { int n; while (scanf("%d", &n) == 1 && n) { for (int i = 0; i < n; ++i) rec[i] = i; for (int i = 0; i < n; ++i) scanf("%d%d%d%d", &X0[i], &Y0[i], &X1[i], &Y1[i]); bool ok = 1; sort(rec, rec+n, cmp1); memset(vis, 0, sizeof(vis)); int p = 0; while (p < n) { bool Vis = 0; for (int x = X0[rec[p]]; x <= X1[rec[p]]; ++x) if (!vis[x]) { vis[x] = Vis = 1; r[rec[p]] = x; break; } if (!Vis) ok = 0; p++; } sort(rec, rec+n, cmp2); memset(vis, 0, sizeof(vis)); p = 0; while (p < n) { bool Vis = 0; for (int y = Y0[rec[p]]; y <= Y1[rec[p]]; ++y) if (!vis[y]) { vis[y] = Vis = 1; c[rec[p]] = y; break; } if (!Vis) ok = 0; p++; } if (!ok) printf("IMPOSSIBLE\n"); else for (int i = 0; i < n; ++i) printf("%d %d\n", r[i], c[i]); } return 0; }