Cod sursa(job #1263238)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 14 noiembrie 2014 10:39:38
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.61 kb
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
#define Nmax 1000
#define nrDir 4

int m, n;
int dl[nrDir] = {-1, 0, 1, 0};
int dc[nrDir] = {0, 1, 0, -1};
int t[Nmax][Nmax];
char s[Nmax + 1];
pair< int, int > I, O;
queue< pair<int, int> > Q;
vector< bool > viz[Nmax];

void read() ;
void gen() ;
bool ok(int) ;

int main()
{
    int st, dr, mijl, gasit = 0;
    read();
    gen();
    
    /*for(int i = 0; i < n; ++i)
    {
        for(int j = 0; j < n; ++j) fout << t[i][j] << ' ';
        fout << '\n';
    }
    */
    for(st = 0, dr = m * n; st < dr; )
    {
        mijl = (st + dr) >> 1;
        if(ok(mijl)) st = mijl, gasit = 1;
        else dr = mijl - 1;
    }
    
    if(!gasit) fout << "-1\n";
    else fout << st << '\n';
    return 0;
}

void read()
{
    int i, j;
    fin >> m >> n; fin.get();
    
    for(i = 0; i < m; ++i)
    {
        viz[i].resize(n);
        fin.getline(s, Nmax + 1);
        
        for(j = 0; j < n; ++j)
            switch(s[j])
            {
                case 'I': {I = make_pair(i, j); break;}
                case 'O': {O = make_pair(i, j); break;}
                case 'D': {Q.push( make_pair(i, j) ); viz[i][j] = 1; break;}
                case '*': {t[i][j] = -1; break;}
            }
    }
}

void gen()
{
    int a, b;
    pair< int, int > vf;
    
    while( !Q.empty() )
    {
        vf = Q.front(); Q.pop();
        for(int k = 0; k < nrDir; ++k)
        {
            a = vf.first + dl[k];
            b = vf.second + dc[k];
            
            if(0 <= a && a < m && 0 <= b && b < n && viz[a][b] == 0)
            {
                viz[a][b] = 1;
                t[a][b] = 1 + t[vf.first][vf.second];
                Q.push( make_pair(a, b) );
            }
        }
    }
}

bool ok(int d)
{
    int a, b;
    pair< int, int > vf;
    
    while( !Q.empty() ) Q.pop();
    for(a = 0; a < m; ++a) fill(viz[a].begin(), viz[a].end(), 0);
    
    Q.push(I); viz[I.first][I.second] = 1;
    while( !Q.empty() )
    {
        vf = Q.front(); Q.pop();
        for(int k = 0; k < nrDir; ++k)
        {
            a = vf.first + dl[k];
            b = vf.second + dc[k];
            
            if(0 <= a && a < m && 0 <= b && b < n)
                if(viz[a][b] == 0 && t[a][b] >= d)
                {
                    viz[a][b] = 1;
                    Q.push( make_pair(a, b) );
            
                    if(O == make_pair(a, b)) return 1;
                }
        }
    }
    return 0;
}