Cod sursa(job #2311865)

Utilizator MaxTeoTeo Oprescu MaxTeo Data 3 ianuarie 2019 19:41:55
Problema Fractal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <bits/stdc++.h>
using namespace std;

ifstream f("fractal.in");
ofstream g("fractal.out");

int k, x, y, solution;

/*
int Hilbert(int prev, int k, int x, int y)
{
    if(k == 0)
        return 0;

    int size = pow(2, k - 1);

    // 1 4
    // 2 3
    if(prev == 2 || prev == 3)
    {
        int val = pow(2, 2 * (k - 1));
        // 1
        if(x <= size && y <= size)
            return Hilbert(1, k - 1, x, y);
        else // 4
        if(x <= size && y > size)
            return val * 3 + Hilbert(4, k - 1, x, y - size);
        else // 2 // 1
        if(x > size && y <= size)
            return val + Hilbert(2, k - 1, x - size, y);
        else // 3
        if(x > size && y > size)
            return val * 2 + Hilbert(3, k - 1, x - size, y - size);
    }
    else
    // 1 2
    // 4 3
    if(prev == 1)
    {
        int val = pow(2, 2 * (k - 1));
        // 1
        if(x <= size && y <= size)
            return Hilbert(1, k - 1, x, y);
        else // 2
        if(x <= size && y > size)
            return val + Hilbert(2, k - 1, x, y - size);
        else // 4
        if(x > size && y <= size)
            return val * 3 + Hilbert(4, k - 1, x - size, y);
        else // 3
        if(x > size && y > size)
            return val * 2 + Hilbert(3, k - 1, x - size, y - size);
    }
    else
    // 3 4
    // 2 1
    {
        int val = pow(2, 2 * (k - 1));
        // 3
        if(x <= size && y <= size)
            return Hilbert(3, k - 1, x, y);
        else // 4
        if(x <= size && y > size)
            return val * 3 + Hilbert(4, k - 1, x, y - size);
        else // 2
        if(x > size && y <= size)
            return val + Hilbert(2, k - 1, x - size, y);
        else // 1
        if(x > size && y > size)
            return val * 2 + Hilbert(1, k - 1, x - size, y - size);
    }
}
*/

void Hilbert(int k, int x, int y)
{
    int size;

    if(k > 0)
    {
        --k;
        size = pow(2, k);
        if(x <= size && y <= size)
            Hilbert(k, y, x);
        else
        if(x > size && y <= size)
        {
            solution += size * size;
            Hilbert(k, x - size, y);
        }
        else
        if(x > size && y > size)
        {
            solution += 2 * size * size;
            Hilbert(k, x - size, y - size);
        }
        else
        {
            solution += 3 * size * size;
            Hilbert(k, 2 * size + 1 - y, size - x + 1);
        }
    }
}

int main()
{
    f >> k >> x >> y;
    Hilbert(k, y, x);
    g << solution;
    return 0;
}