Cod sursa(job #403878)

Utilizator Cristy94Buleandra Cristian Cristy94 Data 25 februarie 2010 14:52:37
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include<stdio.h>
FILE *f=fopen("fractal.in","r");
FILE *g=fopen("fractal.out","w");
unsigned long long k,x,y,nr,p[101],poz;
void divid(int a){
if(poz==1){
  //daca este in C1
  if(x<=p[a]/2&&y<=p[a]/2){
	    poz=2;
		return;
  }
  //daca este in C2
  if(x>p[a]/2&&y<=p[a]/2)
	{   nr+=p[2*(a-1)];
        x-=p[a]/2;
		poz=1;
		return;
	}
  //daca este in C3
  if(x>p[a]/2&&y>p[a]/2)
  { nr+=2*p[2*(a-1)];
    x-=p[a]/2;
	y-=p[a]/2;
	poz=1;
	return;
  }
  //daca este in C4
  if(x<=p[a]/2&&y>p[a]/2)
  { nr+=3*p[2*(a-1)];
    y-=p[a]/2;
	poz=3;
	return;
  }
}
else if(poz==2){
  //daca este in C1
  if(x<=p[a]/2&&y<=p[a]/2){
	    poz=1;
		return;
  }
  //daca este in C2
  if(x<=p[a]/2&&y>p[a]/2) 
	{   nr+=p[2*(a-1)];
        y-=p[a]/2;
		poz=2;
		return;
	}
  //daca este in C3
  if(x>p[a]/2&&y>p[a]/2)
  { nr+=2*p[2*(a-1)];
    x-=p[a]/2;
	y-=p[a]/2;
	poz=2;
	return;
  }
  //daca este in C4
  if(x>p[a]/2&&y<=p[a]/2)
  { nr+=3*p[2*(a-1)];
    x-=p[a]/2;
	poz=4;
	return;
  }
}
else if(poz==3){
  //daca este in C1
  if(x>p[a]/2&&y>p[a]/2){
	x-=p[a]/2;
	y-=p[a]/2;
	    poz=4;
		 return;
  }
  //daca este in C2
 if(x>p[a]/2&&y<=p[a]/2)
	{   nr+=p[2*(a-1)];
        x-=p[a]/2;
		poz=3;
		 return;
	}
  //daca este in C3
  if(x<=p[a]/2&&y<=p[a]/2) 
  { nr+=2*p[2*(a-1)];
    poz=3;
	 return;
  }
  //daca este in C4
  if(x<=p[a]/2&&y>p[a]/2)
  { nr+=3*p[2*(a-1)];
    y-=p[a]/2;
	poz=1;
	 return;
  }
}

if(poz==4){
  //daca este in C1
  if(x>p[a]/2&&y>p[a]/2){
	x-=p[a]/2;
	y-=p[a]/2;
	    poz=3;
		 return;
  }
  //daca este in C2
 if(x<=p[a]/2&&y>p[a]/2)
	{   nr+=p[2*(a-1)];
        y-=p[a]/2; 
		poz=4;
		 return;
	}
  //daca este in C3
  if(x<=p[a]/2&&y<=p[a]/2) 
  { nr+=2*p[2*(a-1)];
   	poz=4;
	 return;
  }
  //daca este in C4
  if(x>p[a]/2&&y<=p[a]/2)
  { nr+=3*p[2*(a-1)];
    x-=p[a]/2;
	poz=2;
	 return;
  }
}
}
int main(){
	p[0]=1;
fscanf(f,"%llu%llu%llu",&k,&y,&x);
nr=0;
for(int i=1;i<=2*(k-1);i++)
	   p[i]=p[i-1]*2; //ridicam 2 la puterea k
 poz=1;
while(k>1){
	divid(k);
	k--;	
}
if(poz==1){
	if(x==2&&y==1)
		nr++;
	else if(x==2&&y==2)
		  nr=nr+2;
else if(x==1&&y==2)
	    nr=nr+3;
}
else if(poz==2){
	if(x==2&&y==1)
		nr+=3;
	else if(x==1&&y==2)
		  nr+=1;
else if(x==2&&y==2)
	    nr+=2;
}
else if(poz==3){
	if(x==1&&y==1)
		nr+=2;
	else if(x==1&&y==2)
		  nr+=3;
else if(x==2&&y==1)
	    nr+=1;
}
else if(poz==4){
	if(x==1&&y==2)
		  nr++;
	else if(x==1&&y==1)
		   nr+=2;
	else if(x==2&&y==1)
	       nr+=3;
}
fprintf(g,"%llu",nr);
return 0;
}