Cod sursa(job #2208557)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 30 mai 2018 13:39:17
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <queue>
#include <fstream>
#include <iostream>
#include <tuple>

using namespace std;

ifstream fin ("barbar.in");
ofstream fout ("barbar.out");

const int Dim = 1001, Inf = 0x3f3f3f3f;
const int di[] = {1,-1,0,0}, dj[]={0,0,1,-1};
int A[Dim][Dim],B[Dim][Dim],C[Dim][Dim],n,k,m,si,sj,fi,fj;
char O[Dim][Dim];
pair < int , int > D[Dim];
queue <  pair  < int, int > >  Q;

void LeeD() ;
void Lee();

int main() {

    fin >> n >> m;
    fin.get();
    for ( int i = 1; i <= n; ++i){
        fin >> (O[i] + 1);
        for ( int j = 1 ; j <= m; ++j) {
            if ( O[i][j] == 'D')
                D[++k] = { i, j};
            else
                if ( O[i][j] == 'I' )
                    si = i , sj = j;
            else
                if ( O[i][j] == 'O' )
                    fi = i, fj = j;
            else
                if( O[i][j] == '*' )
                    A[i][j] = 1;
            B[i][j] = Inf;
            }
    }
    for ( int i = 1; i <= k; ++i) {
        B[D[i].first][D[i].second] = 0;
        Q.push({D[i].first, D[i].second});
        }
    LeeD();
    for(int i = 1; i <= n; ++i)
        for(int j = 1; j<= m; ++j)
            C[i][j] = B[i][j];
    Lee();
    fout << B[fi][fj];

}

bool OK(int i , int j){
    return 1 <= i and i <= n and 1 <= j and j <= m and A[i][j] == 0;
}


void LeeD() {

    int i,j;
    while(! Q.empty() ) {
        tie(i,j) = Q.front();
        Q.pop();
        for ( int x = 0; x < 4; ++x)
            if ( OK(i + di[x], j + dj[x] ) and B[i][j] + 1 < B[i + di[x]][j + dj[x]] ) {
                B[i + di[x]][j + dj[x]] =  B[i][j] + 1;
                Q.push({i + di[x] , j + dj[x]} );
                }

    }
}

void Lee() {

    int i,j;

    Q.push({si,sj});
    while(! Q.empty() ) {
        tie(i,j) = Q.front();
        Q.pop();
        for ( int x = 0; x < 4; ++x)
            if ( OK(i + di[x], j + dj[x] ) and B[i][j] > B[i + di[x]][j + dj[x]] ) {
                B[i + di[x]][j + dj[x]] =  min(B[i][j], C[i+di[x]][j+dj[x]]);
                Q.push({i + di[x] , j + dj[x]} );
                }
    }
}