Cod sursa(job #2140369)

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

bool In_interval(int x, int a, int b) {
    return (a <= x && x <= b) || (b <= x && x <= b);
}

int Modulus(int x) {
    if (x < 0) {
        return -x;
    }
    return x;
}

int Add(int cadr, int x_min, int x_max, int y_min, int y_max) {
    int square_size = ((Modulus(x_max - x_min) + 1) * (Modulus(x_max - x_min) + 1)) / 4;
    if (y_min < y_max) {
        if (x_min < x_max) {
            return square_size * (cadr - 1);
        } else {
            return square_size * (4 - cadr);
        }
    } else {
        if (x_min < x_max) {
            return square_size * (4 - cadr);
        } else {
            return square_size * (cadr - 1);
        }
    }
}

int DI(int x, int y, int x_min, int x_max, int y_min, int y_max) {
    if (Modulus(x_max - x_min) == 1) {
        if (x == x_min && y == y_min) {
            return Add(1, x_min, x_max, y_min, y_max);
        } else {
            if (x == x_min && y == y_max) {
                return Add(2, x_min, x_max, y_min, y_max);
            } else {
                if (x == x_max && y == y_max) {
                    return Add(3, x_min, x_max, y_min, y_max);
                } else {
                    return Add(4, x_min, x_max, y_min, y_max);
                }
            }
        }
    }


    int x_m = (x_max + x_min) / 2;
    if (x_min > x_max) {
        ++x_m;
    }
    int y_m = (y_max + y_min) / 2;
    if (y_min > y_max) {
        ++y_m;
    }

    //cout << x << " " << y << "    " << x_min << " " << x_m << " " << x_max << "    " << y_min << " " << y_m << " " << y_max << "    ";

    if (In_interval(x, x_min, x_m) && In_interval(y, y_min, y_m)) {
        //cout << 1 << " " << Add(1, x_min, x_max, y_min, y_max) << " " << '\n';
        return Add(1, x_min, x_max, y_min, y_max) + DI(y, x, y_m, y_min, x_min, x_m);
    } else {
        if (In_interval(x, x_min, x_m) && In_interval(y, y_m, y_max)) {
            //cout << 2 << " " << Add(2, x_min, x_max, y_min, y_max) << " " << '\n';
            return Add(2, x_min, x_max, y_min, y_max) + DI(x, y, x_min, x_m, y_m, y_max);
        } else {
            if (In_interval(x, x_m, x_max) && In_interval(y, y_m, y_max)) {
                //cout << 3 << " " << Add(3, x_min, x_max, y_min, y_max) << " " << '\n';
                return Add(3, x_min, x_max, y_min, y_max) + DI(x, y, x_m, x_max, y_m, y_max);
            } else {
                //cout << 4 << " " << Add(4, x_min, x_max, y_min, y_max) << " " << '\n';
                return Add(4, x_min, x_max, y_min, y_max) + DI(y, x, y_min, y_m, x_max, x_m);
            }
        }
    }
}

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

    int k, x, y, length;

    f >> k >> x >> y;

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

    g << DI(x, y, 1, length, 1, length);

    return 0;
}