Cod sursa(job #57220)

Utilizator DastasIonescu Vlad Dastas Data 1 mai 2007 13:58:47
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include <cstdio>

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

int m, n, k;
int a[152][152] = {{0}};

void read()
{
    fscanf(in, "%d %d %d", &m, &n, &k);

    for ( int i = 1; i <= m; ++i )
        for ( int j = 1; j <= n; ++j )
            fscanf(in, "%d", &a[i][j]);
}

struct coada
{
    int x, y;
};

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

int lee(int x, int y)
{
    coada b[23104];
    int p = 0, u = 0;
    b[p].x = x;
    b[p].y = y;
    int cnt = 1;
    int chei[23104] = {0};
    int viz[152][152] = {{0}};
    chei[k] = 1;
    viz[x][y] = 1;

    while ( p <= u )
    {
        for ( int i = 0; i < 4; ++i )
        {
            int X = b[p].x + dx[i];
            int Y = b[p].y + dy[i];

            if ( !viz[X][Y] && chei[a[X][Y]] == 1 )
            {
                ++u;
                b[u].x = X;
                b[u].y = Y;
                ++cnt;
                chei[n*X-(n-Y)] = 1;
                viz[X][Y] = 1;
            }
        }

        for ( int i = 0; i <= p; ++i )
        {
            for ( int j = 0; j < 4; ++j )
            {
                int X = b[i].x + dx[j];
                int Y = b[i].y + dy[j];

                if ( !viz[X][Y] && chei[a[X][Y]] == 1 )
                {
                    ++u;
                    b[u].x = X;
                    b[u].y = Y;
                    ++cnt;
                    chei[n*X-(n-Y)] = 1;
                    viz[X][Y] = 1;
                }
            }
        }
        ++p;
    }

//    for ( int i = 0; i <= n*m; ++i )
//        printf("%d ", chei[i]);
//    printf("\n");

    return cnt;
}

int main()
{
    read();

//    for ( int i = 1; i <= m; ++i )
//    {
//        for ( int j = 1; j <= n; ++j )
//            printf("%d ", a[i][j]);
//        printf("\n");
//    }

    int t = 0, x = 0, y = 0;
    for ( int i = 1; i <= m; ++i )
    {
        for ( int j = 1; j <= n; ++j )
        {
            ++t;
            if ( t == k )
            {
                x = i;
                y = j;
                break;
            }
        }
    }
    fprintf(out, "%d\n", lee(x, y));


	return 0;
}