Cod sursa(job #2037767)

Utilizator Alex_dudeDudescu Alexandru Alex_dude Data 12 octombrie 2017 19:14:37
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.46 kb
#include <stdio.h>
#include <math.h>

using namespace std;

FILE *fin, *fout;

int k, x, y;

int inRange1(int a, int k)
{
    return (a >= 1) && (a <= pow(2, k-1));
}

int inRange2(int a, int k)
{
    return (a >= (pow(2, k-1)+1)) && (a <= pow(2, k));
}

int HilbertSize(int k)
{
    return (int)(pow(4, k) - 1);
}

int divide(int k, int x, int y)
{
    if(k == 1)
    {
        if(x == 1 && y == 1) return 0;
        if(x == 1 && y == 2) return 1;
        if(x == 2 && y == 2) return 2;
        if(x == 2 && y == 1) return 3;
    }
    else
    {
        //Check for square

        //Stanga sus
        if(inRange1(x, k) && inRange1(y, k))
        {
            return divide(k-1, y, x);
        }
        //Stanga jos
        else if(inRange1(x, k) && inRange2(y, k))
        {
            return HilbertSize(k-1) + 1 + divide(k-1, x, y - pow(2, k-1));
        }
        //Dreapta jos
        else if(inRange2(x, k) && inRange2(y, k))
        {
            return 2*HilbertSize(k-1) + 2 + divide(k-1, x - pow(2, k-1), y - pow(2, k-1));
        }
        //Dreapta sus
        else if(inRange2(x, k) && inRange1(y, k))
        {
            return 4*HilbertSize(k-1) + 3 - divide(k-1, y, pow(2, k) - x + 1);
        }
    }
}

int main()
{

    fin  = fopen("fractal.in", "r");
    fout = fopen("fractal.out", "w");

    fscanf(fin, "%d %d %d", &k, &x, &y);

    fprintf(fout, "%d", divide(k, x, y));

    return 0;
}