Cod sursa(job #2208558)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 30 mai 2018 13:43:40
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.05 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];
struct sr{
int first,second;
};
queue < sr >  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;
            C[i][j] = -1;
            }
    }
    for ( int i = 1; i <= k; ++i) {
        B[D[i].first][D[i].second] = 0;
        Q.push({D[i].first, D[i].second});
        }
    LeeD();
    Lee();
    fout << C[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() ) {
        i = Q.front().first;
        j = Q.front().second;
        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});
    C[si][sj] = B[si][sj];
    while(! Q.empty() ) {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for ( int x = 0; x < 4; ++x)
            if ( OK(i + di[x], j + dj[x] ) and C[i][j] > C[i + di[x]][j + dj[x]] ) {
                C[i + di[x]][j + dj[x]] =  min(C[i][j], B[i+di[x]][j+dj[x]]);
                Q.push({i + di[x] , j + dj[x]} );
                }
    }
}