Cod sursă (job #756074)

Utilizator avatar Bufulici27 Badu Ioana Bufulici27 IP ascuns
Problemă Hex Compilator cpp-32 | 1.88 kb
Rundă Arhiva de probleme Status evaluat
Dată 19 ian. 2024 21:01:07 Scor 10
#include <iostream>
#include <fstream>
#define N_MAX 501

using namespace std;

ifstream in("hex.in");
ofstream out("hex.out");

int colors[N_MAX][N_MAX], n;
int parent[N_MAX*N_MAX], sizeSet[N_MAX*N_MAX];

int lin[] = {0, -1, 0, 1, -1, 1}, col[] = {-1, 0, 1, 0, 1, -1};

int find (int x){
    if (x == parent[x])
        return x;
    return parent[x] = find(parent[x]);
}

bool unite (int x, int y, bool ok){
    int setX, setY, i;

    setX = find(x);
    setY = find(y);

    if (sizeSet[setX] < sizeSet[setY])
        swap (setX, setY);

    if (setX != setY){
        sizeSet[setX] += sizeSet[setY];
        parent[setY] = setX;

        if (ok)
            sizeSet[setX]++;
    }

    if (sizeSet[setX] >= n+2)
        return true;
    return false;
}

bool verif(int x, int y, int color){
    if (color == 1){ // albastru - verticala
        if (x == 1 || x == n)
            return true;
    }
    else if (color == 2){
        if (y == 1 || y == n)
            return true;
    }
    return false;
}

int main (){
    int x, y, idx1;
    bool ok = false, rez = false;

    in >> n;
    for (int i=1; i<=n*n; ++i){
        in >> x >> y;

        idx1 = (x-1) * n + y;
        parent[idx1] = idx1;
        sizeSet[idx1] = 1;

        if (i % 2 == 0){
            colors[x][y] = 1;
        }
        else{ // rosul- pe laterala
            colors[x][y] = 2;
        }
        ok = verif(x, y, colors[x][y]);

        for (int k=0; k<6; ++k){
            int veciniX, veciniY, idx2;

            veciniX = x + lin[k];
            veciniY = y + col[k];

            idx2 = (veciniX-1) * n + veciniY;

            if (colors[veciniX][veciniY] == colors[x][y]){
                rez = unite(idx1, idx2, ok);
            }
        }

        if (rez == true){
            out << i;
            return 0;
        }
    }
    return 0;
}