Cod sursa(job #2360960)

Utilizator bogdi1bogdan bancuta bogdi1 Data 2 martie 2019 11:57:29
Problema Fractal Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <cstdio>

using namespace std;
int pas[20];
int solve(int k, int x, int y, int inv)
{
    int sol=0;
    if(k==1){
        if(inv==0){
            if(x==1){
                if(y==1)
                    return 0;
                else
                    return 3;
            }
            else{
                if(y==1)
                    return 1;
                else
                    return 2;
            }
        }
        else{
            if(x==1){
                if(y==1)
                    return 3;
                else
                    return 2;
            }
            else{
                if(y==1)
                    return 1;
                else
                    return 0;
            }
        }
    }
    else{
        if(inv==0){
            if(x<=1<<(k-1) && y<=1<<(k-1))
                return sol+solve(k-1, y, (1<<(k-1))+1-x, 1);
            else{
                sol+=pas[k-1]+1;
                if(x>1<<(k-1) && y<=1<<(k-1))
                    return sol+solve(k-1, x-(1<<(k-1)), y,0);
                else{
                    sol+=pas[k-1]+1;
                    if(x>1<<(k-1) && y>1<<(k-1))
                        return sol+solve(k-1, x-(1<<(k-1)), y-(1<<(k-1)), 0);
                    else{
                        sol+=pas[k-1]+1;
                        return sol+solve(k-1, (1<<(k-1))+1-(y-(1<<(k-1))), x, 1);
                    }
                }
            }
        }
        else{
            if(x<=1<<(k-1) && y>1<<(k-1))
                return sol+solve(k-1, (1<<(k-1))+1-(y-(1<<(k-1))), x, 1);
            else{
                sol+=pas[k-1]+1;
                if(x>1<<(k-1) && y>1<<(k-1))
                    return sol+solve(k-1, x-(1<<(k-1)), y-(1<<(k-1)), 0);
                else{
                    sol+=pas[k-1]+1;
                    if(x>1<<(k-1) && y<=1<<(k-1))
                        return sol+solve(k-1, x-(1<<(k-1)), y,0);
                    else{
                        sol+=pas[k-1]+1;
                        return sol+solve(k-1, y, (1<<(k-1))+1-x, 1);
                    }
                }
            }
        }
    }
}
int main()
{   freopen("fractal.in", "r",stdin);
    freopen("fractal.out", "w",stdout);
    int k,x,y,i;
    for(i=1; i<=15; i++)
        pas[i]=pas[i-1]*4+3;
    scanf("%d%d%d", &k, &y, &x);
    printf("%d", solve(k, x, y, 0));
    return 0;
}