Pentru această operație este nevoie să te autentifici.
Cod sursă (job #80773)
Utilizator |
|
IP | ascuns |
---|---|---|---|
Problemă | Hex | Compilator | cpp | 2,81 kb |
Rundă | Tema 4 clasele 9-10 2014/15 | Status | evaluat |
Dată | 22 oct. 2014 00:19:11 | Scor | 0 |
#include <cstdio>
int p[500];
using namespace std;
int m[500][500];
void init(int n)
{
for (int i = 0; i < n; i++)
{
p[i] = i;
}
}
int find(int x)
{
int r = x;
while (p[r] != r)
{
r = p[r];
}
while (p[x] != r)
{
int tmp = p[x];
p[x] = r;
x = tmp;
}
return r;
}
void union1(int x, int y)
{
int rx = find(x), ry = find(y);
if (rx != ry)
{
p[rx] = ry;
}
}
int main()
{
FILE *fin,*fout;
fin=fopen("hex.in","r");
fout=fopen("hex.out","w");
int v[250000],n,x1,x2,x,a,b,a1,a2,b1,b2,i,j;
fscanf(fin,"%d",&n);
init(n*n);
fscanf(fin,"%d&d",&a1,&b1);
m[a1][b1]=1;
x1=a1+(b1-1)*n;
fscanf(fin,"%d&d",&a2,&b2);
m[a2][b2]=2;
x2=a2+(b2-1)*n;
for(i=2; i<n*n; i++)
{
if(i%2==0)
{
fscanf(fin,"%d&d",&a,&b);
m[a][b]=1;
x=a+(b-1)*n;
if(m[a][b]==m[a+1][b]) union1(x,x+1);
if(m[a][b]==m[a-1][b]) union1(x,x-1);
if(m[a][b]==m[a][b+1]) union1(x,x+n);
if(m[a][b]==m[a][b-1]) union1(x,x-n);
if(m[a][b]==m[a+1][b-1]) union1(x,x+1-n);
if(m[a][b]==m[a-1][b+1]) union1(x,x-1+n);
if (a==n)
{
for(j=1; j<=n; j++)
{
if(j==1) x1=1;
else x1+=n;
if (find(x)==find(x1)) fprintf(fout,"%d",i);
}
}
if (a==1)
{
for(j=1; j<=n; j++)
{
if(j==1) x1=n;
else x1+=n;
if (find(x)==find(x1)) fprintf(fout,"%d",i);
}
}
}
else
{
fscanf(fin,"%d&d",&a,&b);
m[a][b]=1;
x=a+(b-1)*n;
if(m[a][b]==m[a+1][b]) union1(x,x+1);
if(m[a][b]==m[a-1][b]) union1(x,x-1);
if(m[a][b]==m[a][b+1]) union1(x,x+n);
if(m[a][b]==m[a][b-1]) union1(x,x-n);
if(m[a][b]==m[a+1][b-1]) union1(x,x+1-n);
if(m[a][b]==m[a-1][b+1]) union1(x,x-1+n);
if (b==n)
{
for(j=1; j<=n; j++)
{
if(j==1) x1=1;
else x1+=n;
if (find(x)==find(j)) fprintf(fout,"%d",i);
}
}
if (b==1)
{
for(j=1; j<=n; j++)
{
if(j==1) x1=n;
else x1+=n;
if (find(x)==find(n*(n-1)+j)) fprintf(fout,"%d",i);
}
}
}
}
return 0;
}