类似八皇后,但是把皇后改成车,同时每个车都框定范围放置。
把行和列分开,看成两个问题。同时贪心,优先放置在包含它的右界最小的区间。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=5010;
int xl[maxn],yl[maxn],xr[maxn],yr[maxn],x[maxn],y[maxn],n;
bool solve(int *a,int *l,int *r)
{
int cur,mr;
memset(a,-1,sizeof(int)*n);
for(int i=1;i<=n;i++)
{
cur=-1,mr=maxn;
for(int k=0;k<n;k++)
if(a[k]<0&&l[k]<=i&&r[k]<mr)
mr=r[cur=k];
if(cur<0||i>mr) return 0;
a[cur]=i;
}
return 1;
}
int main()
{
while(cin>>n&&n)
{
for(int i=0;i<n;i++)
scanf("%d%d%d%d",&xl[i],&yl[i],&xr[i],&yr[i]);
if(solve(x,xl,xr)&&solve(y,yl,yr))
for(int i=0;i<n;i++)
printf("%d %d\n",x[i],y[i]);
else puts("IMPOSSIBLE");
}
return 0;
}