Cod sursa(job #2487502)

Utilizator lucianistratiIstrati Lucian lucianistrati Data 4 noiembrie 2019 21:11:15
Problema Fractal Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2 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,putere;
        p=pow/2;
        q=(1<<(k-1));
        putere=q*q;
        k--;
        if(prim.x<=p && prim.y<=p)// 1
        {
            //cout<<"case1";
            punct urm;
            urm.x=prim.y;
            urm.y=prim.x;
            return fractal(p,k,urm);
        }
        else if(prim.x>p && prim.y<=p)//2
        {
            //cout<<"case2";
            prim.x-=p;
            return putere+fractal(p,k,prim);
        }
        else if(prim.x>p && prim.y>p)//3
        {
           // cout<<"case3";
            prim.x-=p;
            prim.y-=p;
            return 2*putere+fractal(p,k,prim);
        }
        else if(prim.x<=p && prim.y>p)//4
        {
            //cout<<"case4";
            punct urm;
            //cout<<pow<<" "<<prim.y<<" "<<p<<" "<<prim.x<<'\n';
            urm.x=pow-prim.y+1;
            urm.y=p-prim.x+1;
            return 3*putere+fractal(p,k,urm);
        }
    }
}
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=b;
    prim.y=c;
    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;
}