Cod sursa(job #1000384)

Utilizator florin.elfusFlorin Elfus florin.elfus Data 22 septembrie 2013 19:41:38
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <fstream>
#include <vector>
#include <bitset>
#include <queue>
#include <algorithm>
#include <ctime>
#include <utility>
#include <string.h>

#define x first
#define y second
//#define debug

using namespace std;

ifstream cin("barbar.in");
ofstream cout("barbar.out");

const int   LEE = 1005,
            dx[4] = {1, 0, -1,  0},
            dy[4] = {0, 1,  0, -1};

int n, m, d[LEE][LEE];
char s[LEE][LEE];

bool viz[LEE][LEE];

queue < pair<int, int> > Q;
pair<int, int> Source, Sink;

inline bool check(int minnow)
{
    while(!Q.empty())
        Q.pop();
    if(d[Source.x][Source.y] < minnow)
        return false;
    memset(viz, false, sizeof(viz));
    for(Q.push(Source) ; !Q.empty() ; Q.pop() )
    {
        pair<int, int> act = Q.front();
        if(act == Sink)
            return true;
        for(int i = 0 ; i < 4; ++ i)
        {
            int xnou = act.x + dx[i];
            int ynou = act.y + dy[i];
            if(xnou >= 1 && ynou >= 1 && xnou <= n && ynou <= m && d[xnou][ynou] >= minnow && !viz[xnou][ynou] && s[xnou][ynou] != '*')
            {
                viz[xnou][ynou] = true;
                Q.push(make_pair(xnou, ynou));
            }
        }
    }
    return false;
}

inline int bs(int st, int dr)
{
    int mij, fin = 0;
    while(st <= dr)
    {
        mij = ((st+dr) >> 1);
        if(check(mij))
        {
            fin = mij;
            st = mij + 1;
        }
        else dr = mij - 1;
    }
    return fin;
}

inline void bfs()
{
    for( pair<int, int> x = Q.front() ; !Q.empty() ; Q.pop(), x = Q.front() )
        for(int i = 0 ; i < 4 ; ++ i)
        {
            int xnou = x.x + dx[i];
            int ynou = x.y + dy[i];
            if( xnou >= 1 && ynou >= 1 && xnou <= n && ynou <= m && !d[xnou][ynou] && s[xnou][ynou] != '*')
            {
                d[xnou][ynou] = d[x.x][x.y] + 1;
                Q.push(make_pair(xnou, ynou));
            }
        }
}

int main()
{
    cin >> n >> m;
    cin.get();
    for(int i = 1 ; i <= n ; ++ i)
    {
        cin.getline(s[i]+1, LEE);
        for(int j = 1 ; j <= m ; ++ j)
            switch(s[i][j])
            {
                case('I'):
                    Source.x = i;
                    Source.y = j;
                    break;
                case('O'):
                    Sink.x = i;
                    Sink.y = j;
                    break;
                case('D'):
                    d[i][j] = 1;
                    Q.push(make_pair(i, j));
                    break;
            }
    }

    bfs();

    #ifdef debug
    for(int i = 1 ; i <= n ; ++ i, cout << '\n')
        for(int j = 1 ; j <= m ; ++ j)
            cout << d[i][j] << ' ';
    #endif

    cout << bs(0, n+m) - 1 << "\n";

    return 0;
}