Cod sursă (job #542017)

Utilizator avatar am.001 Mihai Agrici am.001 IP ascuns
Problemă Hex Compilator cpp | 2.25 kb
Rundă lasm_13_03_2020_cl_12c_a Status evaluat
Dată 13 mar. 2020 12:26:04 Scor 100
#include<stdio.h>
#define N 500
#define NORD 0
#define SUD 1
#define VEST 2
#define EST 3
char dirl[]= {1,1,0,0,-1,-1};
char dirc[]= {-1,0,-1,1,0,1};
char touch[4][N*N];
char v[N][N];
int p[N*N],h[N*N];
int find(int x){
    int r=x;
    while(p[r]!=r)
        r=p[r];
    while(p[x]!=r){
        int aux=p[x];
        p[x]=r;
        x=aux;
    }
    return r;
}
void init(int n){
    int i;
    for(i=0;i<n;i++){
        p[i]=i;
        h[i]=1;
    }
}
void myUnion(int x, int y){
    int rx=find(x),ry=find(y),i;
    for(i=0;i<4;i++){
        if(touch[i][ry]==1)
            touch[i][rx]=1;
        if(touch[i][rx]==1)
            touch[i][ry]=1;
    }
    if(rx!=ry){
        if(h[rx]<h[ry])
            p[rx] = ry;
        else if(h[rx] > h[ry])
            p[ry]=rx;
        else{
            p[rx]=ry;
            h[ry]++;
        }
    }
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("hex.in","r");
    fout=fopen("hex.out","w");
    int n,nrMove=1;
    fscanf(fin,"%d",&n);
    init(n*n);
    while(nrMove<=n*n){
        int l,c,cont,i;
        fscanf(fin,"%d%d",&l,&c);
        l--,c--;
        if(nrMove==4)
            nrMove++,nrMove--;
        v[l][c]=nrMove%2+1;
        int rx=find(l*n+c);
        if(l==0)
            touch[NORD][rx]=1;
        else if(l==n-1)
            touch[SUD][rx]=1;
        if(c==0)
            touch[VEST][rx]=1;
        else if(c==n-1)
            touch[EST][rx]=1;
        for(i=0; i<6; i++){
            int lnou=l-dirl[i],cnou=c-dirc[i];
            if(cnou>=0&&cnou<n&&lnou>=0&&lnou<n&&v[lnou][cnou]==v[l][c])
                myUnion(l*n+c,lnou*n+cnou);
        }
        rx=find(l*n+c);
        if(nrMove%2==0&&touch[NORD][rx]==1&&touch[SUD][rx]==1){
            fprintf(fout,"%d",nrMove);
            return 0;
        }
        if(nrMove%2==1&&touch[EST][rx]==1&&touch[VEST][rx]==1){
            fprintf(fout,"%d",nrMove);
            return 0;
        }
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        
        nrMove++;
    }
    return 0;
}