Cod sursa(job #1839266)

Utilizator silkMarin Dragos silk Data 2 ianuarie 2017 17:40:50
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>

int K,x,y;

void rotire(int k, int x0, int y0, int& x, int& y)
{
    int xb=x;
    x = x0 + (y-y0);
    y = y0 + (x0 + (1<<k) - 1 - xb);
}

void oglinda(int k, int x0, int y0, int& x, int& y)
{
    y = y0 + ( y0 + (1<<k) - 1 - y);
}

int steps(int k, int x0, int y0, int x, int y)
{
    if(k==1)
    {
        if(x0==x && y0==y) return 0;
        else if(x==x0+1 && y0==y) return 1;
        else if(x==x0+1 && y==y0+1) return 2;
        else return 3;
    }

    if(x >= x0+(1<<k-1) && y >= y0+(1<<k-1) ) return (1<<k-1)*(1<<k-1)*2 + steps(k-1, x0+(1<<k-1), y0+(1<<k-1), x, y);
    else if( x >= x0+(1<<k-1) && y < y0+(1<<k-1) ) return (1<<k-1)*(1<<k-1) + steps(k-1, x0+(1<<k-1), y0, x, y);
    else if( x < x0+(1<<k-1) && y < y0+(1<<k-1) )
    {
        int xb,yb;
        xb = x0;
        yb = y0;

        rotire(k-1,xb,yb,x0,y0);
        rotire(k-1,xb,yb,x,y);
        oglinda(k-1,xb,yb,x0,y0);
        oglinda(k-1,xb,yb,x,y);

        return steps(k-1, x0, y0, x, y);
    }
    else
    {
        int xb,yb;
        xb = x0;
        yb = y0 + (1<<k-1);
        x0 = x0 + (1<<k-1) - 1;
        y0 = y0 + (1<<k) - 1;

        rotire(k-1,xb,yb,x0,y0);
        rotire(k-1,xb,yb,x0,y0);
        rotire(k-1,xb,yb,x0,y0);
        rotire(k-1,xb,yb,x,y);
        rotire(k-1,xb,yb,x,y);
        rotire(k-1,xb,yb,x,y);
        oglinda(k-1,xb,yb,x0,y0);
        oglinda(k-1,xb,yb,x,y);

        return (1<<k-1)*(1<<k-1)*3 + steps(k-1, x0, y0, x, y);
    }
}

int main(){
    freopen("fractal.in","r",stdin);
    freopen("fractal.out","w",stdout);

    scanf("%d %d %d",&K,&y,&x);
    printf("%d\n", steps(K,1,1,x,y) );


return 0;
}