#include <stdio.h>
#include <stdlib.h>
#include <math.h>
FILE *in,*out;
int k,y,x; //y=coloana,x=linia , 2^k * 2^k
int pasi(int x,int y) //da nr. de pasi pana la pozitia (x,y) din cadrul curbei de nivel 1
{
if (x==1 && y==1) return 0;
if (x==2 && y==1) return 1;
if (x==2 && y==2) return 2;
if (x==1 && y==2) return 3;
}
int cadran(int x,int y,int k)
{
int prag=pow(2,k-1);
if (x<=prag)
{
if (y<=prag)
return 0;
else
return 3;
}
else
{
if (y<=prag)
return 1;
else
return 2;
}
}
int nrpasi(int x,int y,int k)
{
int rez;
printf("k=%d x=%d y=%d \n",k,x,y);
if (k==1)
{
printf("numarul de pasi este : %d\n",pasi(x,y));
return pasi(x,y);
}
int cad=cadran(x,y,k);
printf("cadranul este : %d\n",cad);
switch (cad)
{
case 0:
{
rez= nrpasi(y,x,k-1); //rotim cadranul la dreapta , deci se modifica x si y
break;
}
case 1:
{
x-=pow(2,k-1);
rez= cad*pow(2,2*k-2) + nrpasi(x,y,k-1);
break;
}
case 2:
{
x-=pow(2,k-1);
y-=pow(2,k-1);
rez= cad*pow(2,2*k-2) + nrpasi(x,y,k-1);
break;
}
case 3:
{
y-=pow(2,k-1);
rez = cad*pow(2,2*k-2) + nrpasi(pow(2,k-1)-y+1,pow(2,k-1)-x+1,k-1); //rotire cadran la stanga
break;
}
default: printf("eroare \n");
}
return rez;
}
int main()
{
int rez;
in=fopen("fractal.in","r");
out=fopen("fractal.out","w");
fscanf(in,"%d %d %d",&k,&y,&x);
rez=nrpasi(x,y,k);
fprintf(out,"%d",rez);
fclose(in);
fclose(out);
//getch();
return 0;
}