Cod sursa(job #57624)

Utilizator DastasIonescu Vlad Dastas Data 2 mai 2007 18:37:01
Problema Castel Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <cstdio>
#include <stdlib.h>
#include <math.h>

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;
//            }
//        }
//    }
//    printf("%d %d\n", x, y);
//    printf("%d %d\n", (k-1)/n+1, k%n);

    fprintf(out, "%d\n", lee((k-1)/n+1, k%n));


	return 0;
}