Cod sursă (job #93688)

Utilizator avatar AlexNiculae Niculae Alexandru-Vlad AlexNiculae IP ascuns
Problemă Hex Compilator cpp | 1,60 kb
Rundă Arhiva de probleme Status evaluat
Dată 30 nov. 2014 14:13:05 Scor 30
#include <cstdio>
#include <cstring>
#define crt (x-1)*n+y
#define nou (x+dx[j]-1)*n+y+dy[j]
#define Nmax 510

using namespace std;

int n,i,j,x,y;
int t[Nmax*Nmax], rang[Nmax*Nmax];
short a[Nmax][Nmax];
bool ap[Nmax*Nmax];

const int dx[7]={0,1,1,-1,-1,0,0};
const int dy[7]={0,-1,0,0,1,-1,1};

int multime(int nod)
{
    if (t[nod]!=nod) t[nod]=multime(t[nod]);

    return t[nod];
}

void reuneste(int x,int y)
{
    x=multime(x);
    y=multime(y);
    if (x==y) return;
    if (rang[x]<rang[y]) t[x]=y;
    else t[y]=x;

    if (rang[x]==rang[y]) rang[x]++;
}

int main()
{
    freopen("hex.in","r",stdin);
    freopen("hex.out","w",stdout);

    scanf("%d", &n);

    for (i=1;i<=n*n;++i) t[i]=i;

    for (i=1;i<=n*n;++i)
    {
        scanf("%d %d", &x, &y);
        a[x][y]=(i%2)+1;

        for (j=1;j<=6;++j)
          if (a[x+dx[j]][y+dy[j]]==(i%2)+1)
             reuneste(crt,nou);

        memset(ap,false,sizeof(ap));
        if (i%2)
        {
            y=1;
            for (x=1;x<=n;++x)
             ap[multime(crt)]=true;

            y=n;
            for (x=1;x<=n;++x)
             if (ap[multime(crt)])
             {
                 printf("%d\n", i);
                 return 0;
             }
        }
        else
        {
            x=1;
            for (y=1;y<=n;++y)
             ap[multime(crt)]=true;

            x=n;
            for (y=1;y<=n;++y)
             if (ap[multime(crt)])
             {
                 printf("%d\n", i);
                 return 0;
             }

        }


    }
    return 0;
}