Cod sursa(job #57188)

Utilizator DastasIonescu Vlad Dastas Data 1 mai 2007 12:41:26
Problema Castel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 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[k/m+1][k%n] = 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[m*X-n+Y] = 1;
                viz[X][Y] = 1;
            }
        }
        ++p;
        if ( p >= u )
        {
            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[m*X-n+Y] = 1;
                        viz[X][Y] = 1;
                    }
                }
            }
        }
    }

    return cnt;
}

int main()
{
    read();
    fprintf(out, "%d\n", lee(k/m+1, k%n));


	return 0;
}