题意 :在一个n*nd的棋盘上放置n个车,使得各个车不在同一行同一列,同时第r个车要在一个规定的矩形之内(x1,y1,x2,y2),结果打印出每个车的位置坐标
方法:贪心
思路:这里有一个小技巧 就是把x和y坐标分开来看,分别求每个车的x和y的值,行列是无关的,因此把原问题分解成一个一维问题,然后使用贪心的方法,
贪心的思路是先按照x2升序排列,然后从x1的位置开始找,找到第一个没有放过车的位置,把此车放在这个位置,y坐标也是如此
代码如下:
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN=5050;
struct Rol
{
int r1,r2,idx;
bool operator<(Rol r)
{
return r2<r.r2||(r2==r.r2&&r1<r.r1);
}
} rol[MAXN];
struct Col
{
int c1,c2,idx;
bool operator<(Col c)
{
return c2<c.c2||(c2==c.c2&&(c1<c.c1));
}
} col[MAXN];
int vis[MAXN],_x[MAXN],_y[MAXN];
int n;
int main()
{
while(~scanf("%d",&n)&&n)
{
memset(_x,0,sizeof(_x));
memset(_y,0,sizeof(_y));
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
scanf("%d%d%d%d",&rol[i].r1,&col[i].c1,&rol[i].r2,&col[i].c2);
rol[i].idx=i;
col[i].idx=i;
}
sort(rol,rol+n);
sort(col,col+n);
int F=0;
for(int i=0; i<n; i++)
{
int flag=0;
for(int j=rol[i].r1; j<=rol[i].r2; j++)
{
if(!vis[j])
{
// cout<<j<<endl;
vis[j]=1;
_x[rol[i].idx]=j;
flag=1;
break;
}
}
if(!flag)
{
F=1;
break;
}
}
if(F)
{
cout<<"IMPOSSIBLE"<<endl;
continue;
}
// cout<<"---------"<<endl;
memset(vis,0,sizeof(vis));
for(int i=0; i<n; i++)
{
int flag=0;
for(int j=col[i].c1; j<=col[i].c2; j++)
{
if(!vis[j])
{
flag=1;
vis[j]=1;
_y[col[i].idx]=j;
break;
}
}
if(!flag)
{
F=1;
break;
}
}
if(F)
{
cout<<"IMPOSSIBLE"<<endl;
continue;
}
for(int i=0; i<n; i++)
{
cout<<_x[i]<<" "<<_y[i]<<endl;
}
}
return 0;
}