Pagini recente » Cod sursa (job #1337119) | Cod sursa (job #1154421) | Cod sursa (job #1578794) | Cod sursa (job #2055383) | Cod sursa (job #829892)
Cod sursa(job #829892)
#include<fstream>
#include<cstring>
#include<algorithm>
#define dim 850
using namespace std;
int poz,jdx,idx;
int i,j,n;
int odd;
int R[dim],rez[dim],w,shiftx,shifty,viz[dim],uz[dim],rots;
struct cub {
int x,y;
}
v[dim],map[dim];
ifstream f("overlap.in");
ofstream g("overlap.out");
int cmp (cub a,cub b){
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
void rot(int k) {
if(k==0)
return ;
int a,b;
a=i;
b=j;
if(k==1){
i=b;
j=-a;
}
if(k==2){
i=-a;
j=-b;
}
if(k==3){
i=-b;
j=a;
}
}
int bs (int i,int j) {
int rs,m,ls;
m=rs=0;
ls=n+1;
while(rs+1<ls) {
m=(rs+ls)/2;
if(v[m].x>i)
ls=m;
else {
if(v[m].x<i)
rs=m;
else
if(v[m].x==i) {
if(v[m].y>j){
ls=m;
}
else
if(v[m].y<j)
rs=m;
else
if(uz[m]==0)
return m;
else
return -1;
}
}
}
return -1;
}
int check() {
int idx;
int val=1;
for(idx=1;idx<=n;++idx) {
if(uz[idx]==0)
val=0;
else
uz[idx]=0;
}
uz[0]=1;
int jdx;
for(idx=1;idx<=n;++idx) {
if(uz[idx]==0 && viz[idx]!=0) {
jdx=idx;
odd=0;
while (!uz[jdx]) {
odd++;
uz[jdx]=1;
rez[jdx]=odd%2+1;
jdx=viz[jdx];
}
if(odd%2)
val=0;
}
}
return val;
}
int main () {
f>>n;
int t=0;
for(i=1;i<=n;++i){
f>>v[i].x>>v[i].y;
map[i]=v[i];
}
sort(v+1,v+1+n,cmp);
for(rots=0; t==0 &&rots<=4;++rots) {
for(idx=2;idx<=n;++idx) {
i=v[1].x;j=v[1].y;// ne folosim de primul punct
rot(rots);//rotim primul punct
memset(uz,0,sizeof(uz));
memset(viz,0,sizeof(viz));
uz[1]=1;
viz[1]=idx;
uz[idx]=1;
shiftx=v[idx].x-i;
shifty=v[idx].y-j;
for(jdx=2;jdx<=n; ++jdx) {
if( uz[jdx]==0 ) {
i=v[jdx].x;
j=v[jdx].y;
rot(rots);//il rotim ;
//il transformam
i+=shiftx;
j+=shifty;
//si ii cautam binar pozitia
w=bs(i,j);
if(w>0) {//
uz[w]=uz[jdx]=1;
viz[jdx]=poz;
}
}
}
if(check()){
t=1;
}
}
}
for(idx=1;idx<=n;idx++)
for (jdx=1; jdx<=n;jdx++)
if (map[jdx].x==v[idx].x && map[jdx].y==v[idx].y)
R[jdx]=rez[idx];
for(idx=1;idx<=n;idx++)
g<<R[idx]<<"\n";
return 0;
}