Cod sursa(job #2029961)

Utilizator anisca22Ana Baltaretu anisca22 Data 30 septembrie 2017 18:39:09
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#define NMAX 1005
#define INF (1<<30)
#define pii pair <int, int>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int R, C, x, y, xx, yy;
char mat[NMAX][NMAX];
int viz[NMAX][NMAX], dragoni[NMAX][NMAX], di[NMAX][NMAX];
queue <pii> q;
int dx[] = {-1, 0, 1, 0};
int dy[] = {0, -1, 0, 1};

int interior(int i, int j)
{
    return i >= 1 && j >= 1 && i <= R && j <= C;
}

void initial(int i, int j)
{
    for (int d = 0; d < 4; d++)
    {
        int ii = i + dx[d];
        int jj = j + dy[d];
        if (dragoni[i][j] + 1 < dragoni[ii][jj] && mat[ii][jj] != '*' && interior(ii, jj))
        {
            q.push({ii, jj});
            dragoni[ii][jj] = dragoni[i][j] + 1;
        }
    }
}

void bfs(int i, int j, int dist)
{
    for (int d = 0; d < 4; d++)
    {
        int ii = i + dx[d];
        int jj = j + dy[d];
        if (di[i][j] + 1 < di[ii][jj] && mat[ii][jj] != '*' && interior(ii,jj) && dragoni[ii][jj] >= dist)
        {
            q.push({ii,jj});
            di[ii][jj] = di[i][j] + 1;
        }
    }
}

int verificare(int dist)
{
    if (dragoni[x][y] < dist)return 0;
    for (int i = 1; i <= R; i++)
        for (int j = 1; j <= C; j++)
            di[i][j] = INF;
    q.push({x, y});
    di[x][y] = 0;
    while (!q.empty())
    {
        pii nr = q.front();
        int i = nr.first;
        int j = nr.second;
        q.pop();
        bfs(i, j, dist);
    }
    if (di[xx][yy] == INF)
        return 0;
    return 1;
}

int main()
{
    fin >> R >> C;
    for (int i = 1; i <= R; i++)
        for (int j = 1; j <= C; j++)
            {
                dragoni[i][j] = INF;
                fin >> mat[i][j];
                if (mat[i][j] == 'D')
                    q.push({i, j}), dragoni[i][j] = 0;
                if (mat[i][j] == 'I')
                    x = i, y = j;
                if (mat[i][j] == 'O')
                    xx = i, yy = j;
            }
    while (!q.empty())
    {
        pii nr = q.front();
        int i = nr.first;
        int j = nr.second;
        q.pop();
        initial(i, j);
    }
    int st = 0, dr = max(R, C) + 1;
    while (st < dr)
    {
        int mij = (st + dr + 1) / 2;
        if (verificare(mij) == 1)
            st = mij;
        else dr = mij - 1;
    }
    if (st == 0)
        fout << st << " ";
    else fout << st << "\n";
    return 0;
}