Cod sursa(job #2604758)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 23 aprilie 2020 14:38:55
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include <bits/stdc++.h>

//std::ifstream fin ("input.txt");
//std::ofstream fout ("output.txt");

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

int dp[1005][1005];
int dragon[1005][1005];
bool a[1005][1005];

std::deque < std::pair < int, int > > dq;

void BFS_dragons (int n, int m){
    int di[4] = {-1, 0, 1, 0};
    int dj[4] = {0, -1, 0, 1};

    while (!dq.empty()){
        int i = dq.front().first;
        int j = dq.front().second;
        dq.pop_front();
        for (int k=0; k<4; k++){
            int ii = i + di[k];
            int jj = j + dj[k];
            if (0 <= ii and ii < n)
            if (0 <= jj and jj < m)
            if (dragon[ii][jj] > dragon[i][j] + 1){
                dragon[ii][jj] = dragon[i][j] + 1;
                dq.push_back ({ii, jj});
            }
        }
    }
}

void BFS_player (int n, int m){
    int di[4] = {-1, 0, 1, 0};
    int dj[4] = {0, -1, 0, 1};

    while (!dq.empty()){
        int i = dq.front().first;
        int j = dq.front().second;
        dq.pop_front();
        for (int k=0; k<4; k++){
            int ii = i + di[k];
            int jj = j + dj[k];
            if (0 <= ii and ii < n)
            if (0 <= jj and jj < m)
            if (a[ii][jj] == 0)
            if (dp[ii][jj] < std::min (dp[i][j], dragon[ii][jj])){
                dp[ii][jj] = std::min (dp[i][j], dragon[ii][jj]);
                dq.push_back ({ii, jj});
            }
        }
    }
}


int main()
{
    int n, m, i, j;
    int sx, sy, fx, fy;
    char chr;
    fin >> n >> m;

    for (i=0; i<n; i++)
    for (j=0; j<m; j++)
    dragon[i][j] = INT_MAX,
    dp[i][j] = -1;

    std::string s;
    for (i=0; i<n; i++){
        fin >> s;
        for (j=0; j<m; j++){
            chr  = s[j];
            if (chr == '.')
                a[i][j] = 0;
            if (chr == '*')
                a[i][j] = 1;
            if (chr == 'I'){
                a[i][j] = 0;
                sx = i;
                sy = j;
            }
            if (chr == 'O'){
                a[i][j] = 0;
                fx = i;
                fy = j;
            }
            if (chr == 'D'){
                dq.push_back ({i, j});
                a[i][j] = 0;
                dragon[i][j] = 0;
            }
        }
    }


    BFS_dragons (n, m);

    /*
    for (i=0; i<n; i++, fout << '\n')
        for (j=0; j<m; j++)
        fout << dragon[i][j] << ' ';
        */

    dq.push_back ({sx, sy});
    dp[sx][sy] = dragon[sx][sy];
    BFS_player (n, m);

    /*
    for (i=0; i<n; i++, fout << '\n')
        for (j=0; j<m; j++)
        fout << dp[i][j] << ' ';
        */

    fout << dp[fx][fy] << '\n';

    return 0;
}