UVa11134传说中的车

匿名 (未验证) 提交于 2019-12-02 23:49:02

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; }

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!