Cod sursa(job #480639)

Utilizator om6gaLungu Adrian om6ga Data 28 august 2010 22:05:39
Problema Fractal Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 2.05 kb
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

FILE *in,*out;
int k,y,x;      //y=coloana,x=linia , 2^k * 2^k


int pasi(int x,int y)  //da nr. de pasi pana la pozitia (x,y) din cadrul curbei de nivel 1
{
    if (x==1 && y==1) return 0;
    if (x==2 && y==1) return 1;   
    if (x==2 && y==2) return 2;
    if (x==1 && y==2) return 3;   
}


int cadran(int x,int y,int k)
{
    int prag=pow(2,k-1);
    if (x<=prag)
    {
       if (y<=prag)
          return 0;
       else 
          return 3;
    }
    else
    {
       if (y<=prag)
          return 1;
       else 
          return 2;
    }
}


int nrpasi(int x,int y,int k)
{
    int rez;
    printf("k=%d x=%d y=%d \n",k,x,y);  
    if (k==1)
    {
       printf("numarul de pasi este : %d\n",pasi(x,y));
       return pasi(x,y);
    }
       
    int cad=cadran(x,y,k); 
    printf("cadranul este : %d\n",cad);
    switch (cad)
    {
           case 0:
           {
                rez=  nrpasi(y,x,k-1);  //rotim cadranul la dreapta , deci se modifica x si y
                break;   
           }            
           case 1:
           {
                x-=pow(2,k-1);    
                rez= cad*pow(2,2*k-2) + nrpasi(x,y,k-1);         
                break;
           }
           case 2:
           {
                x-=pow(2,k-1);
                y-=pow(2,k-1);
                rez= cad*pow(2,2*k-2) + nrpasi(x,y,k-1);            
                break;     
           }
           case 3:
           {
                y-=pow(2,k-1);
                rez = cad*pow(2,2*k-2) + nrpasi(pow(2,k-1)-y+1,pow(2,k-1)-x+1,k-1);  //rotire cadran la stanga        
                break;     
           }
           default: printf("eroare \n");      
    }
    return rez;
}





int main()
{
    int rez;
    in=fopen("fractal.in","r");
    out=fopen("fractal.out","w");
    fscanf(in,"%d %d %d",&k,&y,&x);  
    rez=nrpasi(x,y,k);
    fprintf(out,"%d",rez);
    fclose(in);
    fclose(out);
    //getch();
    return 0;   
}