Pentru această operație este nevoie să te autentifici.

Cod sursă (job #169676)

Utilizator avatar Robert Popovici Robert Robert IP ascuns
Problemă Hex Compilator cpp | 2,21 kb
Rundă Arhiva de probleme Status evaluat
Dată 29 nov. 2015 18:01:54 Scor 20
#include <cstdio>
#define MAXN 500
int mat[MAXN+2][MAXN+2],vf[MAXN+2][MAXN+2];
int dl[]={-1,0,1,1,0,-1},dc[]={0,-1,-1,0,1,1};
inline int find(int l,int c){
    if(mat[l][c]==0)
        return l*1000+c;
    mat[l][c]=find(mat[l][c]/1000,mat[l][c]%1000);
    return mat[l][c];
}
int main(){
    FILE*fi,*fout;
    int i,n,nr,j,con1,con2,l,c,x;
    fi=fopen("hex.in" ,"r");
    fout=fopen("hex.out" ,"w");
    fscanf(fi,"%d" ,&n);
    for(i=1;i<=n;i++)
        for(j=1;j<=n;j++)
           vf[i][j]=-1;
    for(i=0;i<=n+1;i++)
        mat[0][i]=mat[i][0]=mat[n+1][i]=mat[i][n+1]=-1;
    i=0;
    while(i<n*n){
         fscanf(fi,"%d%d" ,&l,&c);
         vf[l][c]=i%2;
         con1=con2=0;
         nr=l*1000+c;
         for(j=0;j<6;j++)
           if(mat[l+dl[j]][c+dc[j]]>-1&&vf[l+dl[j]][c+dc[j]]==i%2){
              //   if(i==6){
               //     printf("%d %d\n" ,l+dl[j],c+dc[j]);
               // }
                x=find(l+dl[j],c+dc[j]);
                if(i%2==0){
                    if(x%1000==1||x%1000==n)
                         nr=x;
                    if(x%1000==1)
                        con1++;
                    if(x%1000==n)
                        con2++;
                }
                else{
                    if(x/1000==1||x/1000==n)
                         nr=x;
                    if(x/1000==1)
                        con1++;
                    if(x/1000==n)
                        con2++;
                }
           }
         if(i%2==0){
            if(c==1)
                con1++;
            if(c==n)
                con2++;
         }
         else{
            if(l==1)
                con1++;
            else
                con2++;
         }
         if(con1>0&&con2>0){
            fprintf(fout,"%d" ,i+1);
            i=n*n;
         }
         else{
             if(nr!=1000*l+c)
                 mat[l][c]=nr;
             for(j=0;j<6;j++)
               if(mat[l+dl[j]][c+dc[j]]>-1&&vf[l+dl[j]][c+dc[j]]==i%2){
                   x=find(l+dl[j],c+dc[j]);
                   if((x/1000)*1000+x%1000!=nr)
                   mat[x/1000][x%1000]=nr;
              }
         }
         i++;
    }
    fclose(fi);
    fclose(fout);
    return 0;
}