Cod sursa(job #2487457)

Utilizator lucianistratiIstrati Lucian lucianistrati Data 4 noiembrie 2019 19:49:10
Problema Fractal Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.59 kb
#include <iostream>
#include <bits/stdc++.h>
#define ll long long int
#define pb push_back
using namespace std;
int k,c,b;
typedef struct
{
    int x,y;
}punct;
int a[3][3],a_st[3][3],a_dr[3][3];
ll p;
int fractal(ll pow,int k,punct prim)
{
    if(k==1)
    {
        return a[prim.x][prim.y];
    }
    else//k>1
    {
        ll p,q;
        p=pow>>1;
        q=1<<(k-1);
        k--;
        if(prim.x<=p && prim.y<=p)// 1
        {
            return fractal(p,k,prim);
        }
        else if(prim.x>=p && prim.y<=p)//2
        {
            prim.x-=p;
            return q+fractal(p,k,prim);
        }
        else if(prim.x>=p && prim.y>=p)//3
        {
            prim.x-=p;
            prim.y-=p;
            return 2*q+fractal(p,k,prim);
        }
        else//4
        {
            return 3*q+fractal(p,k,prim);
        }
    }
}
int main()
{
    ifstream fin("fractal.in");
    ofstream fout("fractal.out");
    punct prim;
    fin>>k>>c>>b;
    if(k==1 && c==1 && b==1)
    {
        fout<<0; return 0;
    }
    prim.x=c;
    prim.y=b;
    ll p;
    p=1<<k;
    //Matricea pentru fractal de ordin 1
    a[1][1]=1;
    a[2][1]=2;
    a[2][2]=3;
    a[1][2]=4;
    //Matricea pentru fractal de ordin 1 rotit la 90 de grade la stanga
    a_st[1][1]=1;
    a_st[2][1]=4;
    a_st[2][2]=3;
    a_st[1][2]=2;
    //Matricea pentru fractal de ordin 1 rotit la 90 de grade la dreapta
    a_dr[1][1]=3;
    a_dr[2][1]=2;
    a_dr[2][2]=1;
    a_dr[1][2]=4;

    fout<<(fractal(p,k,prim)-1);
    fin.close();
    fout.close();
    return 0;
}