Cod sursă (job #756082)

Utilizator avatar Bufulici27 Badu Ioana Bufulici27 IP ascuns
Problemă Hex Compilator cpp-32 | 2.80 kb
Rundă Arhiva de probleme Status evaluat
Dată 19 ian. 2024 21:58:41 Scor 100
#include <iostream>
#include <fstream>
#include <bitset>
#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];
bitset <N_MAX*N_MAX> blueUp = 0;
bitset <N_MAX*N_MAX> blueDown = 0;
bitset <N_MAX*N_MAX> redLeft = 0;
bitset <N_MAX*N_MAX> redRight = 0;

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, int color){
    int setX, setY;

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

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

        if (color == 1){
            if (blueUp[setX] == 0){
                blueUp[setX] = blueUp[setY];
                blueUp[setY] = 0;
            }
            if (blueDown[setX] == 0){
                blueDown[setX] = blueDown[setY];
                blueDown[setY] = 0;
            }
        }
        if (color == 2){
            if (redLeft[setX] == 0){
                redLeft[setX] = redLeft[setY];
                redLeft[setY] = 0;
            }
            if (redRight[setX] == 0){
                redRight[setX] = redRight[setY];
                redRight[setY] = 0;
            }
        }
    }

    if(blueUp[setX] == 1 && blueDown[setX] == 1)
        return true;
    if (redLeft[setX] == 1 && redRight[setX] == 1)
        return true;
    return false;

}

int main (){
    int x, y, idx1, idx2, veciniX, veciniY;
    bool rez = false;

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

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

        if (i % 2 == 0){ // ALBASTRU
            colors[x][y] = 1; 
            if (x == 1)
                blueUp[idx1] = 1;
            else if (x == n)
                blueDown[idx1] = 1;
        }
        else{ // ROSU
            colors[x][y] = 2;
            if (y == 1)
                redLeft[idx1] = 1;
            else if (y == n)
                redRight[idx1] = 1;
        }

        for (int k=0; k<6; ++k){
            veciniX = x + lin[k];
            veciniY = y + col[k];

            if (colors[veciniX][veciniY] == colors[x][y]){ // chiar am ceva acolo
                idx2 = (veciniX-1) * n + veciniY;
                rez = unite(idx1, idx2, colors[x][y]);
            }
        }

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

    cout << '\n';
    for (int i=1; i<=9; ++i)
        cout << i << "    " << blueUp[i] << ' ' << blueDown[i] << ' ' << redLeft[i] << ' ' << redRight[i] << '\n';

    cout << '\n';
    for (int i=1; i<=n; ++i){
        for (int j=1; j<=n; ++j)
            cout << colors[i][j];
        cout << '\n';
    }
    return 0;
}