Cod sursa(job #2328129)

Utilizator iustin948Homoranu Iustin iustin948 Data 25 ianuarie 2019 13:56:52
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
using namespace std;

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

int n, m, startx , starty, k, finx, finy;
pair < int, int > coord[100005];
queue <pair <int, int> > q;
int b[1005][1005];
int a[1005][1005];

void Afisare(int x[1005][1005])
{
    int i,j;
    for(i=1; i<=n; i++)
    {
        for(j=1; j<=m; j++)
            cout << x[i][j] << " ";
        cout << "\n";
    }
    cout << "\n\n";
}

void Read()
{
    char x;
    fin >> n >> m;
    fin.get();
    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= m; j++)
                {
                    fin >> x;
                    if(x == '*') a[i][j] = -1;
                    else if(x == 'D') coord[++k] = {i , j}, a[i][j] = 1;
                    else if(x == 'I') startx = i, starty = j;
                    else if(x == 'O') finx = i, finy = j;
                }

}

void Refresh()
{
    for(int i = 1; i<=n; i++)
        for(int j =1; j<=m; j++)
            a[i][j] = b[i][j];
}

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

inline bool Inside(int i, int j)
{
    if(i < 1 || j < 1 || i > n || j > m)
        return 0;
    if(a[i][j] == -1)
        return 0;
    return 1;
}

void Lee()
{
    int i, j, ii ,jj;
      for(i=1; i<=k; i++)
    q.push({coord[i].first,coord[i].second});
    while(!q.empty())
    {
        i = q.front().first;
        j = q.front().second;
        q.pop();
        for(int d = 0; d < 4; d++)
        {
            ii = i + dx[d];
            jj = j + dy[d];
            if(Inside(ii,jj) && a[ii][jj] == 0 )
            {
                q.push({ii,jj});
                a[ii][jj] = a[i][j] + 1;
            }
        }
    }
}

void Fill(int i, int j, int bin)
{
    if(a[i][j] > bin && Inside(i,j) && b[i][j] == 0)
    {

        b[i][j] = 1;
        Fill(i+1,j,bin);
        Fill(i-1,j,bin);
        Fill(i,j+1,bin);
        Fill(i,j-1,bin);
    }
}

void Reset()
{
    int i, j;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            b[i][j] = 0;
}

void CautBin()
{
    int mij, st, dr, nr;
    bool p = 0;
    st = 0;
    dr = max(n,m);
    while(st <= dr)
    {
        mij = (st + dr) / 2;
        Reset();
        Fill(startx, starty, mij);
        if(b[finx][finy])
            st = mij + 1 ,p = 1, nr = mij;
        else dr = mij - 1;
    }


    if(p)
    fout << nr << "\n";
    else fout << -1 << "\n";
}

int main()
{
    Read();
    Lee();
    CautBin();
    return 0;
}