Pagini recente » Cod sursa (job #331105) | Cod sursa (job #883979) | Cod sursa (job #2498084) | Cod sursa (job #830899) | Cod sursa (job #1740344)
#include<cstdio>
#include<map>
#include<cstring>
#define MAXN 810
using namespace std;
class Point{
public:
int x;
int y;
Point() {};
Point(int x,int y){
this->x=x;
this->y=y;
}
void Rotate(int angle){
int x,y;
if(angle==0)
return;
x=-this->y;
y=this->x;
this->x=x;
this->y=y;
Rotate(angle-1);
}
void Translate(int shiftX,int shiftY){
this->x+=shiftX;
this->y+=shiftY;
}
};
class PointCompare{
public:
bool operator()(const Point &a,const Point &b){
if(a.x==b.x)
return a.y>b.y;
return a.x>b.x;
}
};
Point points[MAXN];
map<Point,int,PointCompare> table;
int degree[MAXN],nextPoint[MAXN],seen[MAXN],answer[MAXN];
int Length(int index,int color){
if(index==0||seen[index])
return 0;
seen[index]=1;
answer[index]=color;
return Length(nextPoint[index],1-color)+1;
}
int main(){
freopen("overlap.in","r",stdin);
freopen("overlap.out","w",stdout);
int n,i,j,angle,shiftX,shiftY,ok;
Point point;
scanf("%d",&n);
for(i=1;i<=n;i++){
scanf("%d%d",&points[i].x,&points[i].y);
table[points[i]]=i;
}
for(angle=0;angle<4;angle++)
for(i=2;i<=n;i++){
memset(degree,0,sizeof(degree));
memset(nextPoint,0,sizeof(nextPoint));
memset(seen,0,sizeof(seen));
memset(answer,0,sizeof(answer));
point=points[i];
point.Rotate(angle);
shiftX=points[1].x-point.x;
shiftY=points[1].y-point.y;
for(j=1;j<=n;j++){
point=points[j];
point.Rotate(angle);
point.Translate(shiftX,shiftY);
if(table.find(point)==table.end())
continue;
nextPoint[j]=table[point];
degree[table[point]]++;
}
ok=1;
for(j=1;j<=n&&ok==1;j++)
if(degree[j]==0&&Length(j,1)%2==1)
ok=0;
if(ok==0)
continue;
for(j=1;j<=n&&ok==1;j++)
if(seen[j]==0&&Length(j,1)%2==1)
ok=0;
if(ok==0)
continue;
for(j=1;j<=n;j++)
printf("%d\n",answer[j]+1);
return 0;
}
return 0;
}