Cod sursa(job #1455747)

Utilizator din99danyMatei Daniel din99dany Data 29 iunie 2015 00:03:00
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 4.05 kb
#include <cstdio>
using namespace std;

const int x_a[4] = {1,-1,0,0};
const int y_a[4]= {0,0,1,-1};


int x[1001 * 1001];
int y[1001 * 1001];
int d_x[1001 * 1001];
int d_y[1001 * 1001];

int v[1001][1001], d[1001][1001], cop[1001][1001];

int lee_initia( int n, int m )
{
    int i, j;
    for( i = 1; i <= n; ++i )
        for( j = 1; j <= m; ++j ) v[i][j] = cop[i][j];

}

int lee( int n, int m, int x_i, int y_i, int x_s, int y_s, int mid )
{

    int x_aa, y_aa, s, k, i, j;

    s = k  = 1;
    x[1] = x_i;
    y[1] = y_i;
    v[x_i][y_i] = 0;


    while( s <= k ){
        for( i = 0; i <= 3; ++i ){
            x_aa = x_a[i] + x[s];
            y_aa = y_a[i] + y[s];
            if( x_aa > 0 && x_aa <= n && x_aa <= m && y_aa > 0 && y_aa <= m && v[x_aa][y_aa] > v[x[s]][y[s]] + 1  && d[x_aa][y_aa] >= mid  ){
                k++;
                x[k] = x_aa;
                y[k] = y_aa;
                v[x_aa][y_aa] = v[x[s]][y[s]] + 1;
            }
        }
        s++;
    }

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


    if( v[x_s][y_s] < 999999999  ) return true;
    else return false;

}



int dragoni( int muha, int n, int m )
{
    int x_aa, y_aa, ma, s, i, k, j;
    j = 1;

    while( j <= muha  ){

        s = k = 1;
        x[1] = d_x[j];
        y[1] = d_y[j];
        d[x[1]][y[1]] = 0;

        while( s <= k ){
            for( i = 0; i <= 3; ++i ){
                x_aa = x_a[i] + x[s];
                y_aa = y_a[i] + y[s];
                if( x_aa > 0 && x_aa <= n && x_aa <= m && y_aa > 0 && y_aa <= m && d[x_aa][y_aa] > d[x[s]][y[s]] + 1 ){
                    k++;
                    x[k] = x_aa;
                    y[k] = y_aa;
                    d[x_aa][y_aa] = d[x[s]][y[s]] + 1;
                }
            }
            s++;
        }
        j++;
    }

}





int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    int n, m, i, j, ma, st, dr, mid, x_i, x_s, y_i, y_s, rasp, ok, k;
    k = 0;

    char xasd;

    scanf("%d%d",&n,&m);

    for( i = 1; i <= n; ++i )
        for( j = 1; j <= m; ++j ) d[i][j] = 999999999;


    for( i = 1; i <= n; ++i ){
        scanf("%*c");
        for( j = 1; j <= m; ++j ){
                scanf("%c",&xasd);
                if( xasd == 'D' ){
                        k++;
                        d_x[k] = i;
                        d_y[k] = j;

                        v[i][j] = 999999999;
                        cop[i][j] = 999999999;
                }
                else if ( xasd == '*' ){
                    v[i][j] = -999999999;
                    cop[i][j] = -999999999;
                    d[i][j] = -999999999;
                }
                else if( xasd == 'O' ){
                    x_s = i;
                    y_s = j;
                    v[i][j] = 999999999;
                    cop[i][j] = 999999999;
                }
                else if( xasd == 'I' ){
                    x_i = i;
                    y_i = j;
                    v[i][j] = 999999999;
                    cop[i][j] = 999999999;
                }
                else{
                    v[i][j] = 999999999;
                    cop[i][j] = 999999999;
                }
        }
    }
    dragoni( k, n, m );

    ma = 0;
    for( i = 1; i <= n; ++i ){
        for( j = 1; j <= m; ++j ){
                if( d[i][j] >= ma ) ma = d[i][j];
                //printf("%d ",d[i][j]);
        }
        //printf("\n");
    }

    ok = 0;
    st = 0;
    dr = ma;
    mid = rasp = 0;

    while( st <= dr ){
        mid = ( st + dr ) / 2;
        lee_initia(n,m);
        //printf(">>%d\n",mid);
        if( lee( n, m, x_i, y_i, x_s, y_s, mid ) ){
            //printf("##%d\n",mid);
            ok = 1;
            rasp = mid;
            st = mid + 1;
        }
        else dr = mid - 1;
    }

    if( ok == 1 ) printf("%d",rasp);
    else printf("-1");

    return 0;
}