Cod sursă (job #293925)

Utilizator avatar adriannicolae Adrian Nicolae adriannicolae IP ascuns
Problemă Hex Compilator cpp | 1,74 kb
Rundă Arhiva de probleme Status evaluat
Dată 17 mar. 2017 18:23:57 Scor 0
#include <stdio.h>
#define NIL 0
#define NR 9
#define MASCA_COL ((1<<NR)+1)
#define MASCA_LIN (MASCA_COL<<9)
#define A1 (MASCA_LIN-1)
#define A2 (MASCA_LIN-2)
#define B1 (MASCA_LIN-3)
#define B2 (MASCA_LIN-4)
#define NRDIR 6
int n, t[2][MASCA_LIN];
int dirlin[NRDIR]=
{
    -1, 0, -1, 1, 1, 0
};
int dircol[NRDIR]=
{
    0, -1, 1, -1, 0, 1
};
inline int lin(int x){
    return x&MASCA_LIN;
}
inline int col(int x){
    return x&MASCA_COL;
}
inline int calc(int l, int c){
    return (l<<NR)+c;
}
int find(int p, int w){
    if(t[w][p]==p){
        return p;
    }
    t[w][p]=find(t[w][p], w);
    return t[w][p];
}
inline void unite(int x, int y, int w){
    int rx, ry;
    rx=find(x, w);
    ry=find(y, w);
    t[w][rx]=ry;
}
inline void actualizeaza(int l, int c, int w){
    int p, i, j;
    t[w][calc(l, c)]=calc(l, c);
    for(p=0; p<NRDIR; p++){
        i=l+dirlin[p];
        j=c+dircol[p];
        if((t[w][calc(i, j)]!=NIL)&&(find(calc(l, c), w)!=find(calc(i, j), w))){
            unite(calc(l, c), calc(i, j), w);
        }
    }
}
inline void init(){
    int i;
    t[0][A1]=A1;
    t[1][B1]=B1;
    t[1][B2]=B2;
    t[0][A2]=A2;
    for(i=0; i<=n+1; i++){
        t[0][calc(i, 0)]=A1;
        t[0][calc(i, n+1)]=A2;
        t[1][calc(0, i)]=B1;
        t[1][calc(n+1, i)]=B2;
    }
}
int main(){
    int i, l, c;
    FILE *fin, *fout;
    fin=fopen("hex.in", "r");
    fout=fopen("hex.out", "w");
    fscanf(fin, "%d", &n);
    init(n);
    i=0;
    while((find(A1, 0)!=find(A2, 0))&&(find(B1, 1)!=find(B2, 1))){
        fscanf(fin, "%d%d", &l, &c);
        actualizeaza(l, c, i&1);
        i++;
    }
    fprintf(fout, "%d\n", i);
    fclose(fin);
    fclose(fout);
    return 0;
}