Cod sursă (job #503092)

Utilizator avatar avramdaniel Beefichor avramdaniel IP ascuns
Problemă Hex Compilator cpp | 3.53 kb
Rundă Arhiva de probleme Status evaluat
Dată 15 nov. 2019 18:57:11 Scor 0
#include <bits/stdc++.h>
using namespace std;

#define fi first
#define se second

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

int mapa[510][510];
pair<int, int> pmax[510][510];
pair<int, int> pmin[510][510];
int n, i, j, curri, currj;

pair<int, int> parent_min(pair<int, int> x){
    int xi = x.fi;
    int xj = x.se;
    if(pmin[xi][xj] == x)
        return x;
    else {
        pmin[xi][xj] = parent_min(pmin[xi][xj]);
        return pmin[xi][xj];
    }
}

pair<int, int> parent_max(pair<int, int> x){
    int xi = x.fi;
    int xj = x.se;
    if(pmax[xi][xj] == x)
        return x;
    else {
        pmax[xi][xj] = parent_max(pmin[xi][xj]);
        return pmax[xi][xj];
    }
}

int main(){

    ifstream cin("hex.in");
    ofstream cout("hex.out");
    cin>>n;

    for(i = 1;i<=n;i++)
        for(j = 1;j<=n;j++){
            pmax[i][j] = {i, j};
            pmin[i][j] = {i, j};
        }

    for(int pas=1;pas<=n*n;pas++){
        cin>>i>>j;
        //cout<<'\n';

        if(pas%2 == 1) {
            mapa[i][j] = 1;
            for(int k =0;k<6;k++){
                curri = i+ row[k];
                currj = j + col[k];
               // max_grup[i][j] = max(max_grup[i][j]);
              //  cout<<curri<<' '<<currj<<'\n';
                if(curri > 0 && curri <= n && currj > 0 && currj <= n) {
                    if(mapa[curri][currj] == 1){
                        if(parent_min({curri, currj}) < parent_min({i, j})) {
                            pmin[parent_min({i,j}).fi][parent_min({i,j}).se] = parent_min({curri, currj});
                        }
                        else pmin[parent_min({curri, currj}).fi][parent_min({curri, currj}).se] = parent_min({i, j});

                        if(parent_max({curri, currj}) > parent_max({i, j})) {
                            pmax[parent_max({i,j}).fi][parent_max({i,j}).se] = parent_max({curri, currj});
                        }
                        else pmax[parent_max({curri, currj}).fi][parent_max({curri, currj}).se] = parent_max({i, j});
                    }
                }


            }
            if(pmax[i][j].se == n && pmin[i][j].se == 1){
                cout<<pas;
                return 0;
            }

        }
        else {
            mapa[i][j] = 2;
            for(int k =0;k<6;k++){
                curri = i+ row[k];
                currj = j + col[k];
               // max_grup[i][j] = max(max_grup[i][j]);
              //  cout<<curri<<' '<<currj<<'\n';
                if(curri > 0 && curri <= n && currj > 0 && currj <= n) {
                    if(mapa[curri][currj] == 2){
                        if(parent_min({curri, currj}) < parent_min({i, j})) {
                            pmin[parent_min({i,j}).fi][parent_min({i,j}).se] = parent_min({curri, currj});
                        }
                        else pmin[parent_min({curri, currj}).fi][parent_min({curri, currj}).se] = parent_min({i, j});

                        if(parent_max({curri, currj}) > parent_max({i, j})) {
                            pmax[parent_max({i,j}).fi][parent_max({i,j}).se] = parent_max({curri, currj});
                        }
                        else pmax[parent_max({curri, currj}).fi][parent_max({curri, currj}).se] = parent_max({i, j});
                    }
                }


            }
            if(pmax[i][j].fi == n && pmin[i][j].fi == 1){
                cout<<pas;
                return 0;
            }

        }
    }


    return 0;
}