Cod sursă (job #514774)

Utilizator avatar AndreiVianu Andrei Ionita AndreiVianu IP ascuns
Problemă Hex Compilator cpp | 2,06 kb
Rundă Arhiva de probleme Status evaluat
Dată 21 dec. 2019 13:37:56 Scor 90
//aproape identica cu solutia oficiala, nu stiam cum sa verific daca a castigat cineva :(

#include <fstream>
#define Nmax 500

#define NORTH 0x08
#define EAST 0x04
#define SOUTH 0x02
#define WEST 0x01

#define RED 1
#define BLUE 2

using namespace std;

ifstream in ("hex.in");
ofstream out ("hex.out");

int n;

struct hexagon
{
    int h;
    int p;
    char color;
    char sides;
};

hexagon v[(Nmax+1)*(Nmax+1)+1];

int index(int i,int j)
{
    return i*(n+2)+j;
}

void _init(int n)
{
    int i,j;
    for (i=1; i<=n; i++)
        for (j=1; j<=n; j++)
        {
            int ind=index(i,j);
            v[ind].p=ind;
            v[ind].h=1;
        }
    for (i=1;i<=n;i++)
    {
      v[index(i,1)].sides|=WEST;
      v[index(1,i)].sides|=NORTH;
      v[index(i,n)].sides|=EAST;
      v[index(n,i)].sides|=SOUTH;
    }
}

int _find(int x)
{
    int r=x;
    while (v[r].p!=r)
        r=v[r].p;
    while (v[x].p!=r)
    {
        int tmp=v[x].p;
        v[x].p=r;
        x=tmp;
    }
    return r;
}

void _union(int x,int y)
{
    if (v[x].color!=v[y].color)
        return;
    x=_find(x),y=_find(y);
    if (x!=y)
    {
        if (v[x].h>v[y].h)
            v[y].p=x;
        else if (v[x].h<v[y].h)
            v[x].p=y;
        else
            v[x].p=y,v[y].h++;
    }
    v[x].sides|=v[y].sides;
    v[y].sides|=v[x].sides;
}


bool mutare(int l,int c,int color)
{
    int ind=index(l,c);
    v[ind].color=color+1;
    _union(ind,index(l,c+1));
    _union(ind,index(l,c-1));
    _union(ind,index(l+1,c-1));
    _union(ind,index(l+1,c));
    _union(ind,index(l-1,c));
    _union(ind,index(l-1,c+1));
    int r=_find(ind);
    int incercare=(color==RED) ? (EAST | WEST) : (NORTH | SOUTH);
    return (v[r].sides&incercare)==incercare;

}

int main()
{
    int moves=0,l,c;
    in>>n;
    _init(n);
    while (in>>l>>c)
    {
        moves++;
        if (mutare(l,c, (moves % 2) ? RED : BLUE))
        {
          out<<moves;
          return 0;
        }
    }
    return 0;
}