Cod sursa(job #2629056)

Utilizator A.D.ADelureanu Ana-Maria A.D.A Data 18 iunie 2020 19:14:29
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <fstream>
#include <deque>
#include <bitset>
#define INF 1000100
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");

struct potae {
    int lin, col, val;
};

struct p1 {
    int l,c;
};

deque < potae > d;
deque <p1> v;
int n, i, j, m, xs, ys, xf, yf, ic, jc, iv, jv, dist, pas, st, dr, mid;
int a[1100][1100], distmin[1100][1100];
char ch;
int di[] = { -1, 1, 0, 0 };
int dj[] = { 0, 0, 1, -1 };
bitset < 1100 > fr[1100];

bool solve ( int val ){
    if ( distmin[xs][ys] < val )
        return 0;
    v.clear(); a[xs][ys] = val;
    v.push_back({xs, ys});
    for ( int i = 1; i <= n; i++ )
        fr[i].reset();
    while ( !v.empty() ){
        int ic = v.front().l;
        int jc = v.front().c;
        if ( ic == xf && jc == yf )
            return 1;
        v.pop_front();
        for ( int pas = 0; pas < 4; pas++ ){
            int iv = ic + di[pas];
            int jv = jc + dj[pas];
            if ( iv && jv && iv <= n && jv <= m &&
                distmin[iv][jv] >= val && !fr[iv][jv] && a[iv][jv] != -1 ){
                v.push_back( { iv, jv } );
                fr[iv][jv] = 1;
            }
        }
    }
    return 0;
}

int main()
{
    f>>n>>m;
    for ( i=1; i <= n; i++ )
        for ( j=1; j <= m; j++ ){
            f>>ch;
            distmin[i][j] = INF;
            if ( ch == 'I' )
                xs = i, ys = j;
            if ( ch == 'D' ){
                d.push_back({i, j, 0});
                distmin[i][j] = 0;
                a[i][j] = -1;
            }
            if ( ch == 'O' )
                xf = i, yf = j;
            if ( ch == '*' )
                a[i][j] = -1, distmin[i][j] = -1;
        }
    while ( !d.empty() ){
        ic = d.front().lin;
        jc = d.front().col;
        dist = d.front().val;
        d.pop_front();
        for ( pas = 0; pas < 4; pas++ ){
            iv = ic+di[pas];
            jv = jc+dj[pas];
            if ( iv && jv && iv <= n && jv <= m && distmin[iv][jv] == INF && a[iv][jv] != -1 ){
                distmin[iv][jv] = dist+1;
                d.push_back( { iv, jv, dist+1 } );
            }
        }
    }
    int maxx = -1;
    for ( i=1; i <= n; i++ )
        for ( j=1; j <= m; j++ )
            maxx = max ( maxx, distmin[i][j] );
    st = 1; dr = maxx; int sol = -1;
    while ( st <= dr ){
        mid = st + ( (dr-st)>>1 );
        if ( solve ( mid ) ){
            st = mid+1;
            sol = mid;
        }
        else dr = mid-1;
    }
    g<<sol;
    return 0;
}