Pagini recente » Cod sursa (job #2976366) | Cod sursa (job #2904108) | Cod sursa (job #2485817) | Cod sursa (job #302250) | Cod sursa (job #829909)
Cod sursa(job #829909)
#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;
if (k != 0)
{
int x=i, y= j;
if (k == 1) {i = y; j= -x;}
if (k == 2) {i = -x; j = -y;}
if (k == 3) {i = -y; j = x;}
}
}
int bn(int i, int j) {
int m,rs;
m=rs=0;
int 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 val=0;
int idx;
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 (viz[idx]!=0 && uz[idx]==0) {
jdx=idx;
odd=0;
while (uz[jdx]==0) {
++odd;
uz[jdx]=1;
rez[jdx]=odd%2+1;
jdx=viz[jdx];
}
if(odd%2)
val=0;
}
return val;
}
int main(){
f>>n;
for(i=1;i<=n;i++) {
f>>v[i].x>>v[i].y;
map[i]=v[i];
}
sort(v+1,v+n+1, cmp);
int t=0;
for (rots=0; t==0 &&rots<=4;rots++) {
for (idx=2; t==0 && idx<=n; idx++){
i=v[1].x;
j=v[1].y;
rot(rots);
for (int j = 0; j <= n; j++) viz[j] = uz[j] = 0;
uz[1]=1;
viz[1]=idx;
uz[idx]=1;
ShiftX=v[i].x-i;
ShiftY=v[i].y-j;
for (jdx=2;jdx<=n;jdx++)
if (uz[jdx]==0){
i=v[jdx].x;
j=v[jdx].y;
rot(rots);
i+=ShiftX;
j+=ShiftY;
w=bn(i,j);
if (w> 0) {
uz[w]=uz[jdx]=1;
viz[jdx]=w;
}
}
if (check()){
}
}
}
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;
}