Pagini recente » Cod sursa (job #1554513) | Cod sursa (job #1472170) | Cod sursa (job #1800520) | Cod sursa (job #2615514) | Cod sursa (job #2487502)
#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;
}