Cod sursa(job #2513704)

Utilizator TigoanMateiTigoan Matei-Daniel TigoanMatei Data 23 decembrie 2019 17:22:58
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.48 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
int n, m;
int a[1001][1001];
int b[1001][1001];
int di[4] = {0, 0, -1, 1};
int dj[4] = {-1, 1, 0, 0};
char c;
int ii, jj, io, jo;
queue < pair <int, int> > Q;
queue < pair <int, int> > D;
bool OK(int i, int j)
{
    if(i < 1 || j < 1 || i > n || j > m)
       return 0;
    if(a[i][j] == -1 || a[i][j] == -2)
       return 0;
    if(i == ii && j == jj)
        return 0;
    return 1;
}
int Lee(int dist)
{
    for(int i = 1; i <= n; ++ i)
        for(int j = 1; j <= m; ++ j)
            a[i][j] = 0;
    int i, j, next_i, next_j;
    a[ii][jj] = 1;
    Q.push(make_pair(ii, jj));
    while(!Q.empty())
    {
        i = Q.front().first;
        j = Q.front().second;
        Q.pop();
        for(int d = 0; d < 4; ++ d)
        {
            next_i = i + di[d];
            next_j = j + dj[d];
            if(OK(next_i, next_j) && b[next_i][next_j] >= dist && !a[next_i][next_j])
            {
                a[next_i][next_j] = a[i][j] + 1;
                Q.push(make_pair(next_i, next_j));
            }
        }
    }
    if(a[io][jo])
        return 1;
    return 0;
}
void Dee()
{
    int i, j, next_i, next_j;
    while(!D.empty())
    {
        i = D.front().first;
        j = D.front().second;
        D.pop();
        for(int d = 0; d < 4; ++ d)
        {
            next_i = i + di[d];
            next_j = j + dj[d];
            if(OK(next_i, next_j) && (b[next_i][next_j] > b[i][j] + 1 || !b[next_i][next_j]))
            {
                b[next_i][next_j] = b[i][j] + 1;
                D.push(make_pair(next_i, next_j));
            }
        }
    }
}
int main()
{
    in >> n >> m;
    for(int i = 1; i <= n; ++ i)
        for(int j = 1; j <= m; ++ j)
        {
            in >> c;
            if(c == '*') a[i][j] = -1;
            if(c == 'D')
            {
                a[i][j] = -2;
                D.push(make_pair(i, j));
            }
            if(c == 'I')
            {
                ii = i;
                jj = j;
            }
            if(c == 'O')
            {
                io = i;
                jo = j;
            }
        }
    Dee();
    int distance = 0;
    for(int i = (1<<29); i >0; i /= 2)
    {
        if(Lee(distance + i))
            distance += i;
    }
    if(!distance)
        distance = -1;
    out << distance;
    return 0;
}