Cod sursă (job #542004)

Utilizator avatar am.001 Mihai Agrici am.001 IP ascuns
Problemă Hex Compilator cpp | 2,23 kb
Rundă lasm_13_03_2020_cl_12c_a Status evaluat
Dată 13 mar. 2020 12:21:42 Scor 20
#include<stdio.h>
#define N 500
char dirl[]= {1,1,0,0,-1,-1};
char dirc[]= {-1,0,-1,1,0,1};
char rlin[N*N],rcol[N*N],rad[500];
char prevRad[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);
    if(x==4)
        x++,x--;
    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--;
        
        
        
        
        
        
        v[l][c]=nrMove%2+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);
        }
        int rx=find(l*n+c);
        if(nrMove%2==0){
            int pp1=0,pp2=0;
            for(i=0;i<n;i++){
                if(v[0][i]==1&&find(i)==rx)
                    pp1=1;
                if(v[n-1][i]==1&&find((n-1)*n+i)==rx)
                    pp2=1;
            }
            
            
            
            
            
            
            
            if(pp1==1&&pp2==1){
                fprintf(fout,"%d",nrMove);
                return 0;
            }
        }
        else{
            int pp1=0,pp2=0;
            for(i=0;i<n;i++){
                if(v[i][0]==2&&find(i*n)==rx)
                    pp1=1;
                if(v[i][n-1]==2&&find(n*i+n-1)==rx)
                    pp2=1;
            }
            if(pp1==1&&pp2==1){
                fprintf(fout,"%d",nrMove);
            }
        }
        nrMove++;
        
        
        
        
        
        
    }
    return 0;
}