Cod sursă (job #542214)

Utilizator avatar Jarvis Adrian Petrusca Jarvis IP ascuns
Problemă Hex Compilator cpp | 3,44 kb
Rundă lasm_13_03_2020_cl_12c_a Status evaluat
Dată 13 mar. 2020 13:37:58 Scor 0
#include<stdio.h>

int next[500][500], sef[500][500], n, latura, vzt, coul;
char culoare[500][500];

void init( int n )
{
    int i, j;
    for (i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            sef[i][j] = i * n + j;
            next[i][j] = i * 500 + j;
        }
    }
}

int find(int l, int c)
{
    return sef[l][c];
}

void unire(int l1, int c1, int l2, int c2)
{
    int fx, i, nx, j, l, c;
    fx = find(l1, c1);
    if (fx != find(l2, c2)) {
        i = l2;
        j = c2;
        do {
            sef[i][j] = fx;
            l = next[i][j] / 500;
            c = next[i][j] % 500;
            i = l;
            j = c;
        } while ( ( i != l2 ) && ( j != c2 ) );

        nx = next[l1][c1];
        next[l1][c1] = next[l2][c2];
        next[l2][c2] = nx;
    }
}



int testare(l, c) {
    if( l >= 0 && c >= 0 && l < n && c < n) {
        return 1;
    }
    else {
        return 0;
    }
}

void printAll (int crt)
{
    int i, j;

    printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n");
printf("culoare =\n");
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            printf("%2d ", culoare[i][j]);
        }
        printf("\n");
    }
printf("sef =\n");
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            printf("%2d ", sef[i][j]);
        }
        printf("\n");
    }
printf("next =\n");
    for(i = 0; i < n; i++) {
        for(j = 0; j < n; j++) {
            printf("%2d ", next[i][j]);
        }
        printf("\n");
    }
printf("\n");

    printf("coul = %d crt = %d  vzt = %d\n", coul, crt, vzt);

    printf("\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ \n");
}

int main ()
{
    int i, l, c, x, k;

    FILE *in, *out;
    in = fopen("hex.in", "r");
    out = fopen("hex.out", "w");

    fscanf(in, "%d", &n);

    init(n);

    latura = n;

    n = n * n;
    for(i = 0; i < n; i++) {
        fscanf(in, "%d%d", &l, &c);
        l = l - 1;
        c = c - 1;
        coul = ( i % 2 ) + 1;
        culoare[l][c] = coul; // rosu = 1 albastru = 2
        if(testare(l - 1, c) == 1 && culoare[l - 1][c] == coul) {
            unire(l, c, l - 1, c);
        }
        if( testare(l + 1, c) && culoare[l + 1][c] == coul) {
            unire(l, c, l + 1, c);
        }
        if( testare(l - 1, c + 1) && culoare[l - 1][c + 1] == coul) {
            unire(l, c, l - 1, c + 1);
        }
        if( testare(l + 1, c - 1) && culoare[l + 1][c - 1] == coul) {
            unire(l, c, l + 1, c - 1);
        }
        if( testare(l, c + 1) && culoare[l][c + 1] == coul) {
            unire(l, c, l, c + 1);
        }
        if( testare(l, c - 1) && culoare[l][c - 1] == coul) {
            unire(l, c, l, c - 1);
        }
        x = sef[l][c];
        vzt = 0;
        if(coul == 1) {
            for(k = 0; k < latura; k++) {
                if(sef[k][0] == x) {
                    vzt++;
                }
                if(sef[k][latura - 1] == x) {
                    vzt++;
                }
            }
        }
        if(coul == 2) {
            for(k = 0; k < latura; k++) {
                if(sef[0][k] == x) {
                    vzt++;
                }
                if(sef[latura - 1][k] == x) {
                    vzt++;
                }
            }
        }
       //printAll(i + 1);
        if(vzt >= 2) {
            fprintf(out, "%d", i + 1);
            break;
        }
        //printAll(i + 1);
    }

    fclose(in);
    fclose(out);

    return 0;
}