Cod sursa(job #1779514)

Utilizator robx12lnLinca Robert robx12ln Data 15 octombrie 2016 13:31:10
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include<fstream>
#include<deque>
#include<cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[1005][1005], dist[1005][1005], is, js, ifin, jfin, f[1005][1005], n, m, st, dr, mid;
deque< pair<int,int> > v;
int di[] = { 0,  0, 1, -1 };
int dj[] = { 1, -1, 0,  0 };
char c;
int inmat( int x, int y ){
    if( 1 <= x && x <= n && 1 <= y && y <= m ){
        return 1;
    }
    return 0;
}
int bfs( int val ){
    memset( f, 0, sizeof(f) );
    v.clear();
    v.push_back( make_pair( is, js ) );
    f[is][js] = 1;
    while( !v.empty() ){
        int ic = v.front().first;
        int jc = v.front().second;
        for( int d = 0; d <= 3; d++ ){
            int iv = ic + di[d];
            int jv = jc + dj[d];
            if( inmat( iv, jv ) == 1 && f[iv][jv] == 0 && dist[iv][jv] >= val ){
                f[iv][jv] = 1;
                v.push_back( make_pair( iv, jv ) );
                if( iv == ifin && jv == jfin ){
                    return 1;
                }
            }
        }
        v.pop_front();
    }
    return 0;
}
int main(){
    fin >> n >> m;
    memset( dist, 0x3f3f3f3f, sizeof(dist) );
    for( int i = 1; i <= n; i++ ){
        for( int j = 1; j <= m; j++ ){
            fin >> c;
            if( c == '*' )
                a[i][j] = 1;
            if( c == 'D' ){
                v.push_back( make_pair(i,j) );
                dist[i][j] = 0;
            }
            if( c == 'I' ){
                is = i;
                js = j;
            }
            if( c == 'O' ){
                ifin = i;
                jfin = j;
            }
        }
    }
    //calculez distantele
    while( !v.empty() ){
        int ic = v.front().first;
        int jc = v.front().second;
        for( int d = 0; d <= 3; d++ ){
            int iv = ic + di[d];
            int jv = jc + dj[d];
            if( inmat( iv, jv ) == 1 && dist[iv][jv] > dist[ic][jc] + 1 ){
                dist[iv][jv] = dist[ic][jc] + 1;
                v.push_back( make_pair( iv, jv ) );
            }
        }
        v.pop_front();
    }
    //caut binar distanta maxima posibila
    st = 1;
    dr = max( n, m );
    while( st <= dr ){
        mid = ( st + dr ) / 2;
        if( bfs( mid ) == 1 ){
            st = mid + 1;
        }else{
            dr = mid - 1;
        }
    }
    if( bfs(dr) == 0 ){
        fout << "-1";
        return 0;
    }
    fout << dr << "\n";
    return 0;
}