Cod sursa(job #2137710)

Utilizator mateidanutDanut Gabriel Matei mateidanut Data 20 februarie 2018 23:31:01
Problema Fractal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <string>
#define NMAX (100000 + 3)
using namespace std;

int main() {
    ifstream f("fractal.in");
    ofstream g("fractal.out");

    int k, x, y, length;

    unsigned long long steps = 0;

    f >> k >> x >> y;

    for (length = 1; k > 0; length *= 2, --k);

    int lx = 1, ly = 1, rx = length, ry = length, rotation = 0;

    length /= 2;

    while (rx - lx > 2) {
        int mx = (lx + rx) / 2;
        int my = (ly + ry) / 2;
        if (x <= mx && y <= my) { // cazul 1
            rx = mx;
            ry = my;
            rotation = (rotation + 3) % 4;
        } else {
            if (x <= mx && y >= my) { // cazul 2
                rx = mx;
                ly = my;
                steps += length * length;
            } else {
                if (x > mx && y > my) { // cazul 3
                    lx = mx;
                    ly = my;
                    steps += 2 * length * length;
                } else { // cazul 4
                    lx = mx;
                    ry = my;
                    rotation = (rotation + 1) % 4;
                    steps += 3 * length * length;
                }
            }
        }
    }

    if (rotation == 0) {
        if (x == lx && y == ly) {
            steps += 0;
        } else {
            if (x == lx && y == ry) {
                steps += 1;
            } else {
                if (x == rx && y == ry) {
                    steps += 2;
                } else {
                    steps += 3;
                }
            }
        }
    } else {
        if (rotation == 1) {
            if (x == lx && y == ly) {
                steps += 2;
            } else {
                if (x == lx && y == ry) {
                    steps += 1;
                } else {
                    if (x == rx && y == ry) {
                        steps += 0;
                    } else {
                        steps += 3;
                    }
                }
            }
        } else {
            if (rotation == 2) {
                if (x == lx && y == ly) {
                    steps += 1;
                } else {
                    if (x == lx && y == ry) {
                        steps += 0;
                    } else {
                        if (x == rx && y == ry) {
                            steps += 3;
                        } else {
                            steps += 2;
                        }
                    }
                }
            } else {
                if (x == lx && y == ly) {
                    steps += 0;
                } else {
                    if (x == lx && y == ry) {
                        steps += 3;
                    } else {
                        if (x == rx && y == ry) {
                            steps += 2;
                        } else {
                            steps += 1;
                        }
                    }
                }
            }
        }
    }

    g << steps;

    return 0;
}