Pagini recente »
Simulare OJI Clasa 10
|
9d.12.3.2015
|
2014-03-18-clasa-78-tema-21
|
9d.12.3.2015
|
Cod sursă (job #542004)
Cod sursă (job
#542004)
#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;
}