Cod sursa(job #1740344)

Utilizator fanache99Constantin-Buliga Stefan fanache99 Data 11 august 2016 14:41:18
Problema Overlap Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#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;
}