Cod sursa(job #1687678)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 13 aprilie 2016 00:18:21
Problema Fractal Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <fstream>

using namespace std;

ifstream fin("fractal.in");
ofstream fout("fractal.out");

int K, x, y, N;
int nr;

void construire(int l1, int c1, int l2, int c2, int cadr)
{
    int lm, cm;
    if (l2-l1==1)
    {
        if (cadr==1)
        {
            if (x==l1 && y==c1)
              fout << nr;
            nr++;
            if (x==l1 && y==c2)
              fout << nr;
            nr++;
            if (x==l2 && y==c2)
              fout << nr;
            nr++;
            if (x==l2 && y==c1)
              fout << nr;
            nr++;
        }
        if (cadr==2)
        {
            if (x==l1 && y==c2)
              fout << nr;
            nr++;
            if (x==l1 && y==c1)
              fout << nr;
            nr++;
            if (x==l2 && y==c1)
              fout << nr;
            nr++;
            if (x==l2 && y==c2)
              fout << nr;
            nr++;
        }
        if (cadr==3 || cadr==4)
        {
            if (x==l1 && y==c1)
              fout << nr;
            nr++;
            if (x==l2 && y==c1)
              fout << nr;
            nr++;
            if (x==l2 && y==c2)
              fout << nr;
            nr++;
            if (x==l1 && y==c2)
              fout << nr;
            nr++;
            fout << '\n';
        }
    }
    else
    {
        lm=(l1+l2) / 2;
        cm=(c1+c2) / 2;
        if (l1<=x && x<=lm && c1<=y && y<=cm)
          construire(l1, c1, lm, cm, 1);
        nr+=(l2-l1)*(l2-l1);
        if (lm+1<=x && x<=l2 && c1<=y && y<=cm)
          construire(lm+1, c1, l2, cm, 3);
        nr+=(cm-c1)*(cm-c1);
        if (lm+1<=x && x<=l2 && cm+1<=y && y<=c2)
          construire(lm+1, cm+1, l2, c2, 4);
        nr+=(l2-lm-1)*(l2-lm-1);
        if (l1<=x && x<=lm && cm+1<=y && y<=c2)
          construire(l1, cm+1, lm, c2, 2);
        nr+=(lm-l1)*(lm-l1);
    }
}

int main()
{
    fin >> K >> x >> y;
    N=1 << K;
    construire(1, 1, N, N, 1);
    fin.close();
    fout.close();
    return 0;
}