Cod sursa(job #2244774)

Utilizator Mihai145Oprea Mihai Adrian Mihai145 Data 23 septembrie 2018 17:21:47
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <fstream>
#include <cstring>
#include <queue>

using namespace std;

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

int r, c, x, y, X, Y;
int matrix[1005][1005];
bool visited[1005][1005];
queue < pair <int, int> > Q;

int dx[] = {-1, 0, 1, 0}, dy[] = {0, 1, 0, -1};

inline bool ValidPoz(int pozx, int pozy)
{
    if(1 <= pozx && pozx <= r)
        if(1 <= pozy && pozy <= c)
            if(matrix[pozx][pozy] != -1)
                return true;
    return false;
}

void InitLee()
{
    while(!Q.empty())
    {
        int pozX = Q.front().first;
        int pozY = Q.front().second;
        Q.pop();

        for(int i = 0; i <= 3; i++)
        {
            int pozXX = pozX + dx[i];
            int pozYY = pozY + dy[i];

            if(ValidPoz(pozXX, pozYY) && matrix[pozXX][pozYY] == 0)
            {
                matrix[pozXX][pozYY] = (matrix[pozX][pozY] == -1) ? 1 : matrix[pozX][pozY] + 1;
                Q.push(make_pair(pozXX, pozYY));
            }
        }
    }
}

bool Lee(int lmt)
{
    if(matrix[x][y] < lmt)
        return false;

    memset(visited, 0, sizeof(visited));
    Q.push(make_pair(x, y));

    while(!Q.empty())
    {
        int pozX = Q.front().first;
        int pozY = Q.front().second;
        Q.pop();

        for(int i = 0; i <= 3; i++)
        {
            int pozXX = pozX + dx[i];
            int pozYY = pozY + dy[i];

            if(ValidPoz(pozXX, pozYY) && visited[pozXX][pozYY] == 0 && matrix[pozXX][pozYY] >= lmt)
            {
                visited[pozXX][pozYY] = 1;
                Q.push(make_pair(pozXX, pozYY));

                if(pozXX == X && pozYY == y)
                    {
                        while(!Q.empty())
                            Q.pop();
                        return true;
                    }
            }
        }
    }

    return false;
}

int main()
{
    fin >> r >> c;
    fin.get();

    char s[1005];
    for(int i = 1; i <= r; i++)
    {
        fin.getline(s, 1002);
        for(int j = 0; j < c; j++)
            if(s[j] == '*')
                matrix[i][j + 1] = -1;
            else if(s[j] == 'D')
                matrix[i][j + 1] = -1, Q.push(make_pair(i, j + 1));
            else if(s[j] == 'I')
                x = i, y = j + 1;
            else if(s[j] == 'O')
                X = i, Y = j + 1;
    }

    InitLee();

    int st = 1, dr = 2000, mid, sol = 0;
    while(st <= dr)
    {
        mid = (st + dr) / 2;

        if(Lee(mid) == true)
        {
            sol = mid;
            st = mid + 1;
        }
        else
            dr = mid - 1;
    }

    fout << ((sol == 0) ? -1 : sol) << '\n';

    return 0;
}