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

Cod sursă (job #80773)

Utilizator avatar rocandu16 Badulescu Dan Andrei rocandu16 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;
}