Fabled Rooks UVA

来源:互联网 发布:淘宝霏慕模特 编辑:程序博客网 时间:2024/06/05 05:43

传送门

题目大意:你的 任务是在一个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;} 


原创粉丝点击