Cod sursă (job #80338)

Utilizator avatar AlexPascadi Alex Pascadi AlexPascadi IP ascuns
Problemă Hex Compilator cpp | 2,79 kb
Rundă Tema 4 clasele 9-10 2014/15 Status evaluat
Dată 19 oct. 2014 16:19:52 Scor 100
#include <stdio.h>

using namespace std;

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

int n;
char stare[N][N];
//0 - neocupat
//1 - rosu
//2 - albastru

struct punct
{
    short int x;
    short int y;
};

punct t[N][N];
//0,0 - radacina suprema
//0,1 - sus, 0,2 - jos, 1,0 - stanga, 2,0 - dreapta

punct rad (short int x, short int y)
{
    punct r;
    if(t[x][y].x==0 && t[x][y].y==0)
    {
        r.x=x;
        r.y=y;
        return r;
    }
    r=rad(t[x][y].x,t[x][y].y);
    t[x][y]=r;
    return r;
}

bool petabla (int x, int y)
{
    if(x<1 || x>n) return 0;
    if(y<1 || y>n) return 0;
    return 1;
}

int main()
{
    FILE *in,*out;
    in=fopen("hex.in","r");
    out=fopen("hex.out","w");
    int i,j,x,y,xv,yv,s;
    punct r1,r2;
    bool gata=0;

    fscanf(in,"%d",&n);
    for(i=0;i<=n;i++)
        for(j=0;j<=n;j++)
            t[i][j].x=t[i][j].y=0;

    i=1;
    while(i<=n*n && !gata)
    {
        fscanf(in,"%d%d",&x,&y);
        if(i%2==1) s=1;
        else s=2;
        stare[x][y]=s;

        r1=rad(x,y);
        for(j=0;j<6;j++)
        {
            xv=x+dx[j];
            yv=y+dy[j];
            if(petabla(xv,yv) && stare[xv][yv]==s)
            {
                r2=rad(xv,yv);
                if(r1.x!=r2.x || r1.y!=r2.y)
                    t[r2.x][r2.y]=r1;
            }
        }

        //verifica vecinitatea cu nodul de sus, jos, stanga, dreapta
        if(s==1)
        {
            if(y==1)
            {
                r2=rad(1,0);
                if(r1.x!=r2.x || r1.y!=r2.y)
                {
                    t[r1.x][r1.y].x=r2.x;
                    t[r1.x][r1.y].y=r2.y;
                }
            }
            if(y==n)
            {
                r2=rad(2,0);
                if(r1.x!=r2.x || r1.y!=r2.y)
                {
                    t[r1.x][r1.y].x=r2.x;
                    t[r1.x][r1.y].y=r2.y;
                }
            }
            if(rad(1,0).x == rad(2,0).x && rad(1,0).y == rad(2,0).y)
                gata=1;
        }
        if(s==2)
        {
            if(x==1)
            {
                r2=rad(0,1);
                if(r1.x!=r2.x || r1.y!=r2.y)
                {
                    t[r1.x][r1.y].x=r2.x;
                    t[r1.x][r1.y].y=r2.y;
                }
            }
            if(x==n)
            {
                r2=rad(0,2);
                if(r1.x!=r2.x || r1.y!=r2.y)
                {
                    t[r1.x][r1.y].x=r2.x;
                    t[r1.x][r1.y].y=r2.y;
                }
            }
            if(rad(0,1).x == rad(0,2).x && rad(0,1).y == rad(0,2).y)
                gata=1;
        }
        i++;
    }

    fprintf(out,"%d",i-1);
    return 0;
}