Cod sursa(job #1122994)

Utilizator radarobertRada Robert Gabriel radarobert Data 25 februarie 2014 21:48:49
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include <fstream>
#include <cmath>

using namespace std;

int x, y;

int drum(int x1, int y1, int x2, int y2, int k, int v)
{
    if (x1 == x2 && y1 == y2)
        return 0;
    if (x2 < x1 || y2 < y1)
        return 0;
    if (k == 1)
    {
        if (x <= (x1+x2) / 2)
        {
            if (y <= (y1+y2) / 2)
                return drum(x1, y1, (x1+x2)/2, (y1+y2)/2, 3, v/4);
            else
                return v + drum(x1, (y1+y2)/2 + 1, (x1+x2)/2, y2, 1, v/4);
        }
        else
        {
            if (y <= (y1+y2) / 2)
                return 3 * v + drum((x1+x2)/2 + 1, y1, x2, (y1+y2)/2, 2, v/4);
            else
                return 2 * v + drum((x1+x2)/2 + 1, (y1+y2)/2 + 1, x2, y2, 1, v/4);
        }
    }
    if (k == 2)
    {
        if (x <= (x1+x2) / 2)
        {
            if (y <= (y1+y2) / 2)
                return 2 * v + drum(x1, y1, (x1+x2)/2, (y1+y2)/2, 2, v/4);
            else
                return v + drum(x1, (y1+y2)/2 + 1, (x1+x2)/2, y2, 2, v/4);
        }
        else
        {
            if (y <= (y1+y2) / 2)
                return 3 * v + drum((x1+x2)/2 + 1, y1, x2, (y1+y2)/2, 1, v/4);
            else
                return drum((x1+x2)/2 + 1, (y1+y2)/2 + 1, x2, y2, 4, v/4);
        }
    }
    if (k == 3)
    {
        if (x <= (x1+x2) / 2)
        {
            if (y <= (y1+y2) / 2)
                return drum(x1, y1, (x1+x2)/2, (y1+y2)/2, 1, v/4);
            else
                return 3 * v + drum(x1, (y1+y2)/2 + 1, (x1+x2)/2, y2, 4, v/4);
        }
        else
        {
            if (y <= (y1+y2) / 2)
                return v + drum((x1+x2)/2 + 1, y1, x2, (y1+y2)/2, 3, v/4);
            else
                return 2 * v + drum((x1+x2)/2 + 1, (y1+y2)/2 + 1, x2, y2, 3, v/4);
        }
    }
    if (k == 4)
    {
        if (x <= (x1+x2) / 2)
        {
            if (y <= (y1+y2) / 2)
                return 2 * v + drum(x1, y1, (x1+x2)/2, (y1+y2)/2, 4, v/4);
            else
                return 3 * v + drum(x1, (y1+y2)/2 + 1, (x1+x2)/2, y2, 3, v/4);
        }
        else
        {
            if (y <= (y1+y2) / 2)
                return v + drum((x1+x2)/2 + 1, y1, x2, (y1+y2)/2, 4, v/4);
            else
                return drum((x1+x2)/2 + 1, (y1+y2)/2 + 1, x2, y2, 2, v/4);
        }
    }
    return 0;
}

int main()
{double k; int q;
    ifstream in("fractal.in");
    ofstream out("fractal.out");
    in >> k >> x >> y;
    k = pow(2.0, k);
    q = (int)k;
    out << drum(1, 1, q, q, 1, q * q / 4) << '\n';

    return 0;
}