Cod sursa(job #1796785)

Utilizator FodosagSera Victor Fodosag Data 3 noiembrie 2016 19:36:48
Problema Fractal Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 8.6 kb
#include <iostream>
#include <fstream>

using namespace std;

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

int val;

void fract(int k, int x, int y, string directie)
{
    if (!k)
        g<<val;
    else
    {
        if (directie == "sus1")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                fract(k-1, newx, newy, "stanga1");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                val += (1<<(2*k - 2));
                fract(k-1, newx, newy, "sus1");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                val += 2*(1<<(2*k - 2));
                fract(k-1, newx, newy, "sus1");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta2");
            }
        }
        else if (directie == "sus2")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                val += 2*(1<<(2*k - 2));
                fract(k-1, newx, newy, "stanga2");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                val += 2*(1<<(2*k - 2));
                fract(k-1, newx, newy, "sus2");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                val += (1<<(2*k - 2));
                fract(k-1, newx, newy, "sus2");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                //val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta1");
            }
        }
        else if (directie  == "stanga1")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                fract(k-1, newx, newy, "sus1");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                val += 3 * (1<<(2*k - 2));
                fract(k-1, newx, newy, "jos2");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                val += 2*(1<<(2*k - 2));
                fract(k-1, newx, newy, "stanga1");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                val += (1<<(2*k - 2));
                fract(k-1, newx, newy, "stanga1");
            }
        }
        else if (directie  == "stanga2")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                val += 3 * (1<<(2*k - 2));
                fract(k-1, newx, newy, "sus2");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                //val += 3 * (1<<(2*k - 2));
                fract(k-1, newx, newy, "jos1");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                val += (1<<(2*k - 2));
                fract(k-1, newx, newy, "stanga2");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                val += 2 * (1<<(2*k - 2));
                fract(k-1, newx, newy, "stanga2");
            }
        }
        else if (directie == "dreapta1")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                val += (1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta1");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                val += 2*(1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta1");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "jos1");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                fract(k-1, newx, newy, "sus2");
            }
        }
        else if (directie == "dreapta2")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                val += 2 * (1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta2");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                val += 1*(1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta2");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                //val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "jos2");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "sus1");
            }
        }
        else if (directie == "jos1")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                val += (1<<(2*k - 2));
                fract(k-1, newx, newy, "jos1");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                fract(k-1, newx, newy, "stanga2");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta1");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                val += 2*(1<<(2*k - 2));
                fract(k-1, newx, newy, "jos1");
            }
        }
        else if (directie == "jos2")
        {
            int mijx = (1<<k)/2;
            int mijy = mijx;
            if (x <= mijx && y <= mijy)
            {
                int newx = x;
                int newy = y;
                val += 2 * (1<<(2*k - 2));
                fract(k-1, newx, newy, "jos2");
            }
            if (x <= mijx && y > mijy)
            {
                int newx = x;
                int newy = y - (1<<(k-1));
                val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "stanga2");
            }
            if (x > mijx && y > mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y - (1<<(k-1));
                //val += 3*(1<<(2*k - 2));
                fract(k-1, newx, newy, "dreapta1");
            }
            if (x > mijx && y <= mijy)
            {
                int newx = x - (1<<(k-1));
                int newy = y;
                val += (1<<(2*k - 2));
                fract(k-1, newx, newy, "jos2");
            }
        }
    }
}

int t;

int main()
{
    int x, y;
    f>>t>>x>>y;
    fract(t,x,y,"sus1");


    return 0;
}