Pentru această operație este nevoie să te autentifici.
Cod sursă (job #169676)
Utilizator |
|
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;
}