Cod sursa(job #1470776)

Utilizator AndreiITCuriman Andrei AndreiIT Data 12 august 2015 12:00:29
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.27 kb
/*
    code by purplecoder
*/
#include <bits/stdc++.h>
#define MAX 1010
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r, c, mat[MAX][MAX], startx, starty, stopx, stopy, dd[MAX][MAX], viz[MAX][MAX];
pair < int, int> q[MAX*MAX];
int p=1, u;
int di[4] = {0, 1, 0, -1};
int dj[4] = {1, 0, -1, 0};
bool ok(int i, int j)
{
    if(i > r or j > c or i < 1 or j < 1)
        return false;
    if(mat[i][j] == -1 or mat[i][j] == -2)
        return false;
    return true;
}
void lee_dd()
{
    int i_urm, j_urm, i, j;
    while(p <= u)
    {
        i = q[p].first;
        j = q[p].second;
        for(int d=0; d<4; ++d)
        {
            i_urm = i + di[d];
            j_urm = j + dj[d];
            if(ok(i_urm, j_urm) and dd[i_urm][j_urm] == 0)
            {
                dd[i_urm][j_urm] = dd[i][j] + 1;
                u++;
                q[u].first = i_urm;
                q[u].second = j_urm;
            }
        }
        p++;
    }
}

int ddd;

void fil(int i, int j)
{
    if(!(ok(i, j) and viz[i][j] == 0))
        return ;
    if (dd[i][j] < ddd)
        return ;
    viz[i][j] = 1;
    fil(i, j+1);
    fil(i, j-1);
    fil(i+1, j);
    fil(i-1, j);
}
bool bine(int d)
{
    ddd = d;
    memset(viz, 0, sizeof(viz));
    fil(startx, starty);
    return viz[stopx][stopy] == 1 ? 1 : 0;
}
int main()
{
    fin>>r>>c;
    for(int i=1; i<=r; ++i)
        for(int j=1; j<=c; ++j)
        {
            char x;
            fin>>x;
            if(x == '*')
                mat[i][j] = -1;
            if(x == 'D')
            {
                mat[i][j] = -2;
                u++;
                q[u].first = i;
                q[u].second = j;
            }
            if(x == 'I')
            {
                startx = i;
                starty = j;
            }
            if(x == 'O')
            {
                stopx = i;
                stopy = j;
            }
        }
    lee_dd();
    int sol = -1;
    int st = 1, dr = r*c;
    while(st<=dr)
    {
        int mij =( st + dr ) / 2;
        if(bine(mij) == 1)
        {
            st = mij+1;
            sol = mij;
        }
        else
            dr = mij -1;
    }
    fout<<sol;
    return 0;
}