Cod sursa(job #1863742)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 31 ianuarie 2017 10:07:57
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.5 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <queue>
#define N 1010
#define INF 101000100
using namespace std;


struct poz{
    int l , c;
};

poz temp , en , st , nod ;

char mat [ N ][ N ];
int dist [ N ][ N ];
bool viz [ N ][ N ];

queue < poz > que;

int dl [] ={ 0 , -1 , 0 , 1 };
int dc [] ={ 1 , 0 , -1 , 0 };
int lin , col ;

void finddrags (){
    static int ll ,cc ,k  ;

    while ( !que.empty() ){
        nod = que.front();
        que.pop();

        for ( k = 0 ; k < 4 ; k ++ ){
            ll = nod.l + dl[ k ];
            cc = nod.c + dc[ k ];

            if  ( ll >= 0 && ll < lin && cc >=0 && cc < col ){
                if ( dist [ ll ][ cc ] > dist [ nod.l ][ nod.c ] + 1 ){
                    dist [ ll ][ cc ] = dist [ nod.l ][ nod.c ] + 1 ;
                    temp.l = ll ;
                    temp.c = cc ;
                    que.push( temp );
                }
            }

        }
    }

}

void printdist ( ){
    static int i , j ;


    for ( i = 0 ; i < lin ; i ++ ){
        for ( j = 0 ; j < col ; j++ ){
            printf("%3d ",dist [ i ][ j ] );
        }
        printf("\n");
    }
}


bool solve ( int dmin ){
    static int i , j , k ,ll , cc  ;

    que.push( st );

    for ( i = 0 ; i < lin ; i++ ){
        for ( j = 0 ; j  <col;j ++ ){
            viz[ i ] [ j ] = 0 ;
        }
    }
    viz [ st.l ][ st.c ] = 1 ;

    if ( dist [ st.l ][ st.c ] < dmin  ){
        return 0 ;
    }

    while( !que.empty() ){
        nod = que.front();
        que.pop();

        for ( k = 0 ; k < 4 ; k ++ ){
            ll = nod.l + dl[ k ];
            cc = nod.c + dc[ k ];

            if  ( ll >= 0 && ll < lin && cc >=0 && cc < col ){
                if ( dist [ ll ][ cc ] >= dmin && viz [ ll ][ cc ] == 0  ){
                    viz [ ll ][ cc ] = 1 ;
                    temp.l = ll ;
                    temp.c = cc ;
                    que.push( temp );
                }
            }

        }

    }

    return viz [ en.l ][ en.c ];

}


int bnrsch ( int l , int r  ){
    static int   mid , sol ;

    while ( l < r ){
        mid = ( l + r ) /2  ;

        sol = solve ( mid );

        if ( sol == 0 ){
            r = mid  ;
        }else {
            l = mid +1   ;
        }

    }
    return l- 1 ;
}

int main(){
    int i , j ;

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


    scanf("%d%d",&lin,&col);


    for ( i = 0 ; i < lin ; i ++ ){
        scanf("%s",mat [ i ] );
    }

    for ( i = 0 ; i <  lin ; i ++ ){
        for ( j = 0 ; j < col ; j ++){
            temp.l = i ;
            temp.c = j ;
            if( mat [ i ] [ j ] == 'D'){

                que.push( temp );
                dist[ i ] [ j ] = 0 ;
            }else if( mat [ i ][ j ] == '*'){
                dist [ i ][ j ] = -1 ;
            }else if ( mat [ i ][ j ] == 'I' ){
                dist [ i ][ j ]= INF ;
                st = temp;
            }else if ( mat [ i ][ j ] == 'O' ){
                dist [ i ][ j ] = INF ;
                en = temp ;
            }else {
                dist [ i ] [ j ] = INF ;
            }
        }
    }


    finddrags();
   // printdist ( );
    int vmax = 0;
    for ( i = 0; i < lin ; i++ ){
        for ( j = 0 ; j < col ; j++ ){
            vmax = max ( vmax , dist [ i  ][ j ] );
        }
    }

    printf("%d",bnrsch ( 0 , vmax ) );


    return 0;
}