Cod sursa(job #3222559)

Utilizator CosminaneBoac Mihai Cosmin Cosminane Data 10 aprilie 2024 21:06:20
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.69 kb
#include <bits/stdc++.h>
using namespace std;
struct coord{
    int lin, col;
};
int dir[4][2] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }, s1, s2, e1, e2, n, m;
bool drum( int v[1005][1005], int d ){
    int i, lin, col, l, c;
    bool gasit = false;
    queue <coord> q;
    q.push( { s1, s2 } );
    while( q.empty() == false && gasit == false ){
        lin = q.front().lin;
        col = q.front().col;
        for( i = 0; i < 4; i++ ){
            l = lin + dir[i][0];
            c = col + dir[i][1];
            if( 0 <= l && l < n && 0 <= c && c < m && v[l][c] >= d ){
                if( l == e1 && c == e2 ){
                    gasit = true;
                }
                else{
                    v[l][c] = -2;
                    q.push( { l, c } );
                }
            }
        }
    }
    return gasit;
}
int main(){
    int v[1005][1005], i, j, lin, col, l, c, stanga, dreapta, mijloc;
    char ch;
    ifstream fin( "barbar.in" );
    ofstream fout( "barbar.out" );
    fin >> n >> m;
    ///cout << 'I';
    queue <coord> q;
    s1 = s2 = e1 = e2 = -1;
    for( i = 0; i < n; i++ ){
        for( j = 0; j < m; j++ ){
            fin >> ch;
            if( ch == 'I' ){
                s1 = i;
                s2 = j;
                v[i][j] = -1;
            }
            else if( ch == 'O' ){
                e1 = i;
                e2 = j;
                v[i][j] = -1;
            }
            else if( ch == 'D' ){
                q.push( { i, j } );
                v[i][j] = 0;
            }
            else if( ch == '*' ){
                v[i][j] = -2;
            }
            else{
                v[i][j] = -1;
            }
            ///cout << i << ' ' << j << ' ' << v[i][j] << '\n';
        }
    }
    ///cout << v[1][6] << '\n';
    while( q.empty() == false ){
        lin = q.front().lin;
        col = q.front().col;
        ///cout << lin << ' ' << col << '\n';
        q.pop();
        for( i = 0; i < 4; i++ ){
            l = lin + dir[i][0];
            c = col + dir[i][1];
            ///cout << l << ' ' << c << '\n';
            if( 0 <= l && l < n && 0 <= c && c < m && ( v[l][c] == -1 || v[l][c] > v[lin][col] + 1 ) ){
                v[l][c] = v[lin][col] + 1;
                ///cout << l << ' ' << c << ' ' << v[l][c] << '\n';
                q.push( { l, c } );
            }
        }
    }
    stanga = -1;
    dreapta = n * m;
    while( dreapta - stanga > 1 ){
        mijloc = ( stanga + dreapta ) / 2;
        if( drum( v, mijloc ) == true ){
            dreapta = mijloc;
        }
        else{
            stanga = mijloc;
        }
    }
    fout << dreapta;
    return 0;
}