Cod sursa(job #1735945)

Utilizator Emy1337Micu Emerson Emy1337 Data 31 iulie 2016 17:52:06
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.08 kb
#include <bits/stdc++.h>

using namespace std;

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

const int MAXN=1000+5;
int n, m, x1, y1, x2, y2, dim;
int a[MAXN][MAXN], b[MAXN][MAXN];
pair <int, int> dragoni[MAXN];
int dl[4] = {-1, 0, 1, 0};
int dc[4] = {0, 1, 0, -1};

inline bool isOK(int i, int j, int b[MAXN][MAXN])
{
    if( b[i][j]!=-1 && b[i][j]!=-2 && i<=n && j<=n && i>=1 && j>=1) return true;
    return false;
}

bool lee(int b[MAXN][MAXN])
{
    queue < pair < int , int > > coada;
    coada.push(make_pair(x1, y1));

    while(!coada.empty())
    {
        int i = coada.front().first;
        int j = coada.front().second;
        coada.pop();
        b[i][j] = -2;

        for(int d=0; d<=3; d++)
        {
            int ii = i + dl[d];
            int jj = j + dc[d];
            if(isOK(ii, jj, b))
            {
                if(ii==x2 && jj==y2)
                    return true;

                b[ii][jj] = -2;
                coada.push(make_pair(ii, jj));
            }
        }
    }
    return false;

}

bool solve(int cat)
{
    queue < pair < int , int > > ddd;

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

    for(int i=1; i<=dim; i++) ddd.push(make_pair(dragoni[i].first, dragoni[i].second));

    ddd.push(make_pair(NULL, NULL));


    while(!ddd.empty() && cat)
    {
        int i = ddd.front().first;
        int j = ddd.front().second;
        ddd.pop();
        b[i][j] = -2;

        if(i == NULL && j == NULL)
        {
            cat--;
            if(cat)
            {
                ddd.push(make_pair(NULL, NULL));
            }
            else
            {
                return lee(b);
            }
            i = ddd.front().first;
            j = ddd.front().second;
            ddd.pop();
            b[i][j] = -2;

        }

        for(int d=0; d<=3; d++)
        {
            int ii = i + dl[d];
            int jj = j + dc[d];

            if(ii<=n && jj<=n && ii>=1 && jj>=1)
            {
                if(b[ii][jj] != -2)
                {
                    ddd.push(make_pair(ii,jj));
                    b[ii][jj] = -2;
                }
            }
        }
    }
    return false;

}

int cb()
{
    int st = 1, dr = 1000, m, last = -1;

    while(st<=dr)
    {
        m = (st+dr) / 2;

        if(solve(m))
        {
            last = m;
            st = m + 1;
        }
        else
            dr = m - 1;
    }

    return last;
}

int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
        {
            char c;
            fin>>c;
            if(c == 'I')
            {
                x1 = i, y1 = j;
            }
            else if(c == 'D')
            {
                dragoni[++dim] = make_pair(i,j);
            }
            else if(c == '*')
            {
                a[i][j] = -1;
            }
            else if(c == 'O')
            {
                x2 = i, y2 = j;
            }
        }

    fout << cb() + 1;
}