Cod sursa(job #2651119)

Utilizator Anakin1001George Giorgiu Gica Anakin1001 Data 21 septembrie 2020 16:51:16
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.34 kb
#include <fstream>
#include <cstring>
#include <queue>

using namespace std;

ifstream f ( "barbar.in" );
ofstream g ( "barbar.out" );

const int N = 1005;
queue < pair < int, int > > q;
int dx[] = { 0, -1, 0, 1, 0 }, dy[] = { 0, 0, 1, 0, -1 }, a[N][N], b[N][N], d[N][N];
int i, j, n, m, sol, pi, pj, ui, uj, mid, st, dr, u, p, mini;
char ch;

bool coada( int v ){
    memset ( b, 0, sizeof ( b ) );
    q.push ( { pi, pj } );
    b[pi][pj] = 1;
    if ( d[pi][pj] < v )
        return 0;
    while ( !q.empty ( ) ){
        int l = q.front ( ).first;
        int c = q.front ( ).second;
        q.pop ( );
        for ( int k = 1; k <= 4; k++ ){
            int ln = l + dx[k];
            int cn = c + dy[k];
            if ( ln >= 1 && ln <= n && cn >= 1 && cn <= n )
            if( a[ln][cn] == 0 && b[ln][cn] == 0 && d[ln][cn] >= v ){
                b[ln][cn] = 1;
                q.push ( { ln, cn } );
                mini = min ( mini, d[ln][cn] );
            }
        }
    }
    return b[ui][uj];
}
int main()
{   f >> n >> m;
    for ( i = 1; i <= n; i++ )
        for ( j = 1; j <= m; j++ ){
            f >> ch;
            if ( ch == '*' )
                a[i][j] = 1;
            else if ( ch == 'D' ){
                a[i][j] = 1;
                q.push ( { i, j } );
                b[i][j] = 1;
            }
            else if ( ch == 'I' ){
                pi = i;
                pj = j;
            }
            else if ( ch == 'O' ){
                ui = i;
                uj = j;
            }
        }
    while ( !q.empty ( ) ){
        int l = q.front ( ).first;
        int c = q.front ( ).second;
        q.pop ( );
        for(int k = 1; k <= 4; k++ ){
            int ln = l + dx[k];
            int cn = c + dy[k];
            if ( ln >= 1 && ln <= n && cn >= 1 && cn <= m )
            if ( a[ln][cn] == 0 && b[ln][cn] == 0 ){
                d[ln][cn] = d[l][c] + 1;
                b[ln][cn] = 1;
                q.push ( { ln, cn } );
            }
        }
    }
    st = 0; dr = n * m;
    sol = -1;
    while ( st <= dr ){
        mini = n * m;
        mid = ( st + dr ) / 2;
        if ( coada ( mid ) == 1 ){
            sol = min ( mini, mid );
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }
    g << sol;
    return 0;
}