Pagini recente »
Istoria paginii runda/probleme_istet
|
Diferențe pentru runda/oji-2023-antrenament-ffa-v2 între reviziile 17 și 18
|
Monitorul de evaluare
|
nufifloricel4
|
Cod sursă (job #542012)
Cod sursă (job
#542012)
#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);
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 i;
for(i=0;i<4;i++){
if(touch[i][y]==1)
touch[i][x]=1;
if(touch[i][x]==1)
touch[i][y]=1;
}
}
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;
if(l==0)
touch[NORD][l*n+c]=1;
else if(l==n-1)
touch[SUD][l*n+c]=1;
if(c==0)
touch[VEST][l*n+c]=1;
else if(c==n-1)
touch[EST][l*n+c]=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&&touch[NORD][l*n+c]==1&&touch[SUD][l*n+c]==1){
fprintf(fout,"%d",nrMove);
return 0;
}
if(nrMove%2==1&&touch[EST][l*n+c]==1&&touch[VEST][l*n+c]==1){
fprintf(fout,"%d",nrMove);
return 0;
}
nrMove++;
}
return 0;
}