Cod sursa(job #935735)

Utilizator sleepaholicNeculaescu Theodor sleepaholic Data 4 aprilie 2013 16:55:12
Problema Party Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.22 kb
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

int distk1[3][3] = {
    {0,0,0},
    {0,0,1},
    {0,3,2}
};

int main()
{
    FILE* fin = fopen("fractal.in", "r");
    FILE* fout = fopen("fractal.out", "w");

    int k, x, y;
    fscanf(fin, "%d %d %d", &k, &x, &y);

    int steps = 0;
    int lenk = pow((long double)2,k);

    while (k > 1)
    {
        int mid = lenk / 2;
        int block = 0;
        if (x <= mid && y <= mid)
        {
            block = 1;
            int tmp = x;
            x = y;
            y = tmp;
        }
        else if (x <= mid && y > mid)
        {
            block = 2;
            y -= mid;
        }
        else if (x > mid && y > mid)
        {
            block = 3;
            y -= mid;
            x -= mid;
        }
        else
        {
            block = 4;
            x -= mid;
            x = mid - x + 1;
            y = mid - y + 1;
            int tmp = x;
            x = y;
            y = tmp;
        }

        steps += (block - 1) * (mid * mid - 1) + (block - 1);

        lenk = mid;
        k--;
    }

    steps += distk1[x][y];

    fprintf(fout, "%d", steps);

    fclose(fin);
    fclose(fout);
}