Cod sursa(job #2226806)

Utilizator catalinlupCatalin Lupau catalinlup Data 30 iulie 2018 17:58:17
Problema Fractal Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.53 kb
#include <fstream>
#define INFILE "fractal.in"
#define OUTFILE "fractal.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
int pow2(int k){
    int ret = (1<<k);
    return ret;
}

void flipVer(int& x, int& y, int k){
    int nx(0),ny(0);
    ny = pow2(k-1)+1-y;
    nx=x;
    x=nx;
    y=ny;
}

void rot90(int& x, int& y, int k){
    int nx(0),ny(0);
    nx = y;
    ny = pow2(k-1)+1-x;
    x=nx;
    y=ny;
}

void rot270(int&x,int&y,int k){
    rot90(x,y,k);
    rot90(x,y,k);
    rot90(x,y,k);
}

void translateCoords(int &x, int &y,int cadr,int k){
    int nx=x;
    int ny=y;
    if(cadr==1){
        rot90(nx,ny,k);
        flipVer(nx,ny,k);
    }
    else if(cadr==2){
        nx-=pow2(k-1);
    }
    else if(cadr==3){
        nx-=pow2(k-1);
        ny-=pow2(k-1);
    }
    else if(cadr==4){
        ny-=pow2(k-1);
        rot270(nx,ny,k);
        flipVer(nx,ny,k);

    }
    x=nx;
    y=ny;
}

int cadran(int x,int y,int k){
    bool mx=false;
    bool my=false;
    int thr=pow2(k-1);
    if(x>thr) mx=true;
    if(y>thr) my=true;
    if(mx){
        if(my) return 3;
       return 2;
    }
    if(my) return 4;
    return 1;
}

int nrpozinainte(int x,int y,int k){
    int cdr = cadran(x,y,k);
    //cout<<x<<" "<<y<<endl;
    if(k==1)
        return cdr-1;
    translateCoords(x,y,cdr,k);
    return (cdr-1)*pow2(k-1)*pow2(k-1)+nrpozinainte(x,y,k-1);
}

int main()
{
    int k,y,x;
    in>>k>>y>>x;
    out<<nrpozinainte(x,y,k);
    return 0;
}