Cod sursa(job #1779349)

Utilizator AlexandruRudiAlexandru Rudi AlexandruRudi Data 15 octombrie 2016 10:15:54
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <bits/stdc++.h>

using namespace std;

int k,x,y;

int RotD(int x){
    if(x==4) return 1;
    return x+1;
}

int RotS(int x){
    if(x==1) return 4;
    return x-1;
}

int Find(int k, int x, int y, int rotire, int val){
    //cout << k << ' ' << x << ' '  << y << ' '  << rotire << ' '  << val << ' '  << '\n';
    if(k==-1) return val;
    if(rotire==1){
        if(x<=pow(2,k) && y<=pow(2,k)) return Find(k-1,x,y,RotD(rotire),val);
        else if(x>pow(2,k) && y<=pow(2,k)) return Find(k-1,x-pow(2,k),y,rotire,val+pow(4,k));
        else if(x>pow(2,k) && y>pow(2,k)) return Find(k-1,x-pow(2,k),y-pow(2,k),rotire,val+2*pow(4,k));
        else if(x<=pow(2,k) && y>pow(2,k)) return Find(k-1,x,y-pow(2,k),RotS(rotire),val+3*pow(4,k));
    }
    else if(rotire==2){
        if(x<=pow(2,k) && y<=pow(2,k)) return Find(k-1,x,y,RotS(rotire),val);
        else if(x>pow(2,k) && y<=pow(2,k)) return Find(k-1,x-pow(2,k),y,RotD(rotire),val+3*pow(4,k));
        else if(x>pow(2,k) && y>pow(2,k)) return Find(k-1,x-pow(2,k),y-pow(2,k),rotire,val+2*pow(4,k));
        else if(x<=pow(2,k) && y>pow(2,k)) return Find(k-1,x,y-pow(2,k),rotire,val+pow(4,k));
    }
    else if(rotire==3){
        if(x<=pow(2,k) && y<=pow(2,k)) return Find(k-1,x,y,rotire,val+2*pow(4,k));
        else if(x>pow(2,k) && y<=pow(2,k)) return Find(k-1,x-pow(2,k),y,RotS(rotire),val+3*pow(4,k));
        else if(x>pow(2,k) && y>pow(2,k)) return Find(k-1,x-pow(2,k),y-pow(2,k),RotD(rotire),val);
        else if(x<=pow(2,k) && y>pow(2,k)) return Find(k-1,x,y-pow(2,k),rotire,val+pow(4,k));
    }
    else if(rotire==4){
        if(x<=pow(2,k) && y<=pow(2,k)) return Find(k-1,x,y,rotire,val+2*pow(4,k));
        else if(x>pow(2,k) && y<=pow(2,k)) return Find(k-1,x-pow(2,k),y,rotire,val+pow(4,k));
        else if(x>pow(2,k) && y>pow(2,k)) return Find(k-1,x-pow(2,k),y-pow(2,k),RotS(rotire),val);
        else if(x<=pow(2,k) && y>pow(2,k)) return Find(k-1,x,y-pow(2,k),RotD(rotire),val+3*pow(4,k));
    }
}

int main()
{
    ifstream in("fractal.in");
    ofstream out("fractal.out");
    in >> k >> y >> x;
    k--;
    if(x<=pow(2,k) && y<=pow(2,k)) out << Find(k-1,x,y,RotD(1),0);
    else if(x>pow(2,k) && y<=pow(2,k)) out << Find(k-1,x-pow(2,k),y,1,pow(4,k));
    else if(x>pow(2,k) && y>pow(2,k)) out << Find(k-1,x-pow(2,k),y-pow(2,k),1,2*pow(4,k));
    else if(x<=pow(2,k) && y>pow(2,k)) out << Find(k-1,x,y-pow(2,k),RotS(1),3*pow(4,k));

}