Cod sursa(job #66311)

Utilizator DastasIonescu Vlad Dastas Data 17 iunie 2007 18:33:55
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.02 kb
#include <stdio.h>
#define maxsz 1024
#define inf 1000000000

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

int n, m;
char a[maxsz][maxsz];
int b[maxsz][maxsz];

int startx, starty;
int endx, endy;

struct coada
{
    short x, y;
};
coada C[maxsz*maxsz];
int p, u = -1;

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

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

    for ( int i = 0; i <= n; ++i )
        b[0][i] = b[n][i] = -1;
    for ( int i = 0; i <= m; ++i )
        b[i][0] = b[i][m] = -1;

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

            b[i][j] = inf;

            if ( a[i][j] == 'I' )
                startx = i, starty = j;
            else if ( a[i][j] == 'O' )
                endx = i, endy = j;
            else if ( a[i][j] == 'D' )
                ++u, C[u].x = i, C[u].y = j, b[i][j] = 0;
            else if ( a[i][j] == '*' )
                b[i][j] = -1;
            else
                b[i][j] = inf;
        }
}

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

            if ( D < b[X][Y] )
            {
                b[X][Y] = D;
                ++u;
                C[u].x = X;
                C[u].y = Y;
            }
        }
        ++p;
    }
}

int check(int dist)
{
    p = 0;
    u = 0;

    C[p].x = startx;
    C[p].y = starty;

    if ( b[startx][starty] < dist )
        return 0;

    char viz[maxsz][maxsz] = {{0}};

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

            if ( X == endx && Y == endy )
                if ( b[endx][endy] >= dist )
                    return 1;
                else
                    return 0;

            if ( X > 0 && Y > 0 && X <= n && Y <= m )
                if ( b[X][Y] >= dist && !viz[X][Y] )
                {
                    ++u;
                    C[u].x = X;
                    C[u].y = Y;
                    viz[X][Y] = 1;
                }
        }
        ++p;
    }

    return 0;
}

int main()
{
    read();
    init();

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

    int lo = 0;
    int hi = n*m+2;
    int sol = -1;

//    for ( int i = 0; i < mx; ++i )
//    {
//        if ( check(i) == 1 )
//            sol = i;
//        else
//            break;
//    }

    while ( lo <= hi )
    {
        int m = (lo + hi) >> 1;

        if ( check(m) == 1 )
            lo = m + 1, sol = m;
        else
            hi = m - 1;
    }

    fprintf(out, "%d\n", sol);

    return 0;
}