Cod sursa(job #2197181)

Utilizator stefanchistefan chiper stefanchi Data 21 aprilie 2018 12:52:00
Problema Fractal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <cstdio>
#include <algorithm>

using namespace std;


void read(int &k, int &x,int &y)
{
    freopen("fractal.in","r",stdin);
    freopen("fractal.out","w",stdout);
    scanf("%d %d %d",&k,&x,&y);
}

int findCadran(int k, int x, int y)
{
    int ordin = 1 << (k-1);
    bool arg1 = (x <= ordin);
    bool arg2 = (y<= ordin);
    if( arg1 && arg2)
        return 1;
    if( arg1 && !arg2)
        return 2;
    if( ! arg1 && !arg2)
        return 3;
    if( ! arg1 && arg2)
        return 4;
}

void modifyCoord(int cadran, int k, int x, int y)
{
    switch(cadran)
    {
        case 1 :
        {
            swap(x,y);
            return;
        }
        case 2 :
        {
            y -= (1<< (k - 1));
            return;
        }
        case 3 :
        {
            x -= (1<< (k - 1));
            y -= (1<< (k - 1));
            return;
        }
        default :
        {
            int tempX = x;
            x = (1<<k) - y + 1;
            y = (1 << k) - tempX + 1;
            x -= (1<< (k - 1));
            return;
        }
    }
}


int RecursiveMethod(int k,int x,int y)
{
    if(k == 0)
        return 0;
    int cadran = findCadran(k,x,y);
    int tempX = x;
    int tempY = y;
    modifyCoord(cadran,k,tempX,tempY);
    int cost = ( cadran - 1) * ( 1 << 2* (k-1));
    return RecursiveMethod(k - 1, tempX, tempY) + cost;
}


int main()
{
    int k,x,y;
    read(k,x,y);
    int raspuns = RecursiveMethod(k,x,y);
    printf("%d ",raspuns);
    return 0;
}