Cod sursa(job #51015)

Utilizator hvm2hvmvoicu hodrea hvm2hvm Data 9 aprilie 2007 18:52:37
Problema Fractal Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.23 kb
#include <fstream>
#include <iostream>

int k,x,y;

void rot(int m[2][2], int r) {
   int i,aux;
   r=r%4+(r<0?4:0);
   for (i=0; i<r; i++) {
      aux=m[0][0];
      m[0][0]=m[1][0];
      m[1][0]=m[1][1];
      m[1][1]=m[0][1];
      m[0][1]=aux;
   }
}

int nrp(int k,int x,int y,int m[2][2],int r) {
   int cx,cy,p,m2[2][2];
   for (cx=0; cx<2; cx++)
      for (cy=0; cy<2; cy++)
         m2[cx][cy]=m[cx][cy];
   rot(m2,r);
   //sx=s%2; sy=(s/2)%2;
   cx=x/(1<<(k-1));
   cy=y/(1<<(k-1));
   p=m2[cy][cx];
   //std::cout << "k=" << k << " x=" << x << " y=" << y << " r=" << r << " p=" << p << "\n";
   if (k==1) return p;
   rot(m2,-r);
   if (p==0||p==3) {
      if (m2[0][0]==0) {
         if (p==0) r--; else r++;
         m2[0][0]=3; m2[0][1]=0; m2[1][0]=2; m2[1][1]=1;
      } else {
         if (p==0) r++; else r--;
         m2[0][0]=0; m2[0][1]=3; m2[1][0]=1; m2[1][1]=2;
      }
   }
   return p*(1<<(k-1))*(1<<(k-1))+nrp(k-1,x-cx*(1<<(k-1)),y-cy*(1<<(k-1)),m2,r);
}

int main () {
   int i,tmp[2][2]={{0,3},{1,2}},max;
   std::ifstream fin("fractal.in");
   std::ofstream fout("fractal.out");
   fin >> k >> x >> y;
   //std::cout << nrp(k,x-1,y-1,tmp,0) << "\n";
   fout << nrp(k,x-1,y-1,tmp,0) << "\n";
   fin.close();
   fout.close();
}