Cod sursa(job #829909)

Utilizator BarracudaFMI-Alex Dobrin Barracuda Data 5 decembrie 2012 23:43:42
Problema Overlap Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#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;
}