Cod sursa(job #879685)

Utilizator cnnonNeagu Cristian cnnon Data 15 februarie 2013 19:27:40
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.8 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;

int pw(int x)
{
    int p=1;
    while(x)
    {
        p*=2;
        x--;
    }
    return p;
}
int cadran(int k, int x, int y)
{
    if (x<=pw(k)/2 && y<=pw(k)/2)   //cadran 1
        return 1;
    if (x>pw(k)/2 && y<=pw(k)/2)   //cadran 2
        return 2;
    if (x>pw(k)/2 && y>pw(k)/2)     //cadran 3
        return 3;
    if (x<=pw(k)/2 && y>pw(k)/2)    //cadran 4
        return 4;
    return 0;
}
void convert (int c,int k, int & x, int & y)
{
    int x2, y2;

    if (c==1)
    {
        x2=y;
        y2=pow(2,k)+1-x;
        x=x2;
        y2=pow(2,k)+1-y2;
        y=y2;
        return;
    }


    if(c==4 )
    {
        y2=x;
        x2=pow(2,k)+1-y;
        x=x2;
        y2=pow(2,k)+1-y2;
        y=y2;
    }

}
void convert2(int k, int & x, int & y)
{
    if (cadran(k,x,y)==2)
    {
         x=x-pow(2,k-1);
         return;
    }
    if(cadran(k,x,y)==3)
    {
        x=x-pow(2,k-1);
        y=y-pow(2,k-1);
        return;
    }
    if (cadran(k,x,y)==4)
    {
        y=y-pow(2,k-1);
        return;
    }
}
int cadran1 (int x, int y)
{
    if(x==1)
    {
         if (y==1)
            return 0;
        else
            return 3;

    }
    if(x==2)
    {
        if (y==1)
            return 1;
        else
            return 2;
    }
    return 0;
}
int recursiv (int k, int x, int y)
{
    int c;
    if (k==1) return cadran1(x,y);
    c=cadran (k,x,y);
    convert2(k,x,y);
    if(c==1 || c==4) convert(c,k-1,x,y);
    return ( (c-1)*pw(2*k-2) ) + recursiv(k-1,x,y);

}

int main()
{
    int k;
    int  x, y;
    ifstream f("fractal.in");
    f>>k>>y>>x;
    ofstream d("fractal.out");
    d<<recursiv(k,x,y);
    return 0;
}