Pagini recente » Cod sursa (job #1499969) | Cod sursa (job #2869301) | Cod sursa (job #1978192) | Cod sursa (job #484626) | Cod sursa (job #1405611)
#include <cstdio>
#include <queue>
#include <map>
#define Nmax 805
#define mp make_pair
using namespace std;
struct Point
{
int x,y;
} a[Nmax];
const int sin[]={0,1, 0,-1};
const int cos[]={1,0,-1, 0};
map < pair<int,int> , int > M;
int sol[Nmax],n,cuplez[Nmax];
bool viz[Nmax],used[Nmax];
queue <int> Q;
inline bool Solve(int rot, int dx, int dy)
{
int i;
for(i=1;i<=n;++i) viz[i]=used[i]=false;
for(i=1;i<=n;++i)
{
Point P;
P.x=a[i].x*cos[rot]-a[i].y*sin[rot]+dx;
P.y=a[i].x*sin[rot]+a[i].y*cos[rot]+dy;
if(M[mp(P.x,P.y)])
{
cuplez[i]=M[mp(P.x,P.y)];
viz[cuplez[i]]=true;
}
}
for(i=1;i<=n;++i)
if(!viz[i]) Q.push(i);
int nr=0;
while(!Q.empty())
{
int nod=Q.front(); Q.pop();
sol[nod]=1; sol[cuplez[nod]]=2; ++nr;
used[nod]=true; used[cuplez[nod]]=true;
if(cuplez[cuplez[nod]] && !used[cuplez[cuplez[nod]]]) Q.push(cuplez[cuplez[nod]]);
}
return (nr==n/2);
}
int main()
{
int i,t;
freopen ("overlap.in","r",stdin);
freopen ("overlap.out","w",stdout);
scanf("%d", &n);
for(i=1;i<=n;++i)
{
scanf("%d%d", &a[i].x,&a[i].y);
M[mp(a[i].x,a[i].y)]=i;
}
for(t=0;t<4;++t)
{
Point P;
P.x=a[1].x*cos[t]-a[1].y*sin[t];
P.y=a[1].x*sin[t]+a[1].y*cos[t];
for(i=2;i<=n;++i)
{
int xx=a[i].x-P.x,yy=a[i].y-P.y;
if(Solve(t,xx,yy))
{
for(i=1;i<=n;++i) printf("%d\n", sol[i]);
return 0;
}
}
}
return 0;
}