Cod sursa(job #1265363)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 17 noiembrie 2014 10:38:50
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 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, rez;
    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 + 1, gasit = 1, rez = mijl;
        else dr = mijl - 1;
    }
     
    if(!gasit) fout << "-1\n";
    else fout << rez << '\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)
                if( t[a][b] != -1 && 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)
{
    if(t[I.first][I.second] < d) return 0;
    
    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;
}