Cod sursa(job #1087376)

Utilizator Athena99Anghel Anca Athena99 Data 19 ianuarie 2014 12:37:24
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>
#include <queue>
#include <string>

using namespace std;

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

const int inf= 1<<30;
const int dx[]= {0, 0, 1, -1};
const int dy[]= {1, -1, 0, 0};
const int nmax= 1000;
const int mmax= 1000;

int d[nmax+2][mmax+2];

struct str {
    int x, y;
};

inline str mp( int x, int y ) {
    str sol;
    sol.x= x;
    sol.y= y;
    return sol;
}

queue <str> q;

void bfs(  ) {
    while ( !q.empty() ) {
        int xb= q.front().x, yb= q.front().y;
        q.pop();

        for ( int i= 0; i<4; ++i ) {
            int x= xb+dx[i], y= yb+dy[i];
            if ( d[xb][yb]+1<d[x][y] ) {
                q.push( mp( x, y ) );
                d[x][y]= d[xb][yb]+1;
            }
        }
    }
}

int check( int v, int x1, int y1, int x2, int y2 ) {
    bool u[nmax+2][mmax+2];
    for ( int i= 0; i<=nmax+1; ++i ) {
        for ( int j= 0; j<=mmax+1; ++j ) {
            u[i][j]= 0;
        }
    }

    queue <str> q2;
    q2.push( mp( x1, y1 ) );
    while ( !q2.empty() ) {
        int xb= q2.front().x, yb= q2.front().y;
        q2.pop();

        for ( int i= 0; i<4; ++i ) {
            int x= xb+dx[i], y= yb+dy[i];
            if ( d[x][y]>=v &&u[x][y]==0 ) {
                u[x][y]= 1;
                q2.push( mp( x, y ) );
            }
        }
    }
    
    return u[x2][y2];
}

int main(  ) {
    int n, m;
    fin>>n>>m;
    for ( int i= 0; i<=n+1; ++i ) {
        d[i][0]= d[i][m+1]= -1;
    }
    for ( int j= 0; j<=m+1; ++j ) {
        d[0][j]= d[n+1][j]= -1;
    }

    int x1= 0, y1= 0, x2= 0, y2= 0;
    for ( int i= 1; i<=n; ++i ) {
        string x;
        fin>>x;
        for ( int j= 1; j<=m; ++j ) {
            if ( x[j-1]=='.' ) {
                d[i][j]= inf;
            } else if ( x[j-1]=='*' ) {
                d[i][j]= -1;
            } else if ( x[j-1]=='D' ) {
                d[i][j]= 0;
                q.push( mp( i, j ) );
            } else if ( x[j-1]=='I' ) {
                d[i][j]= inf;
                x1= i, y1= j;
            } else if ( x[j-1]=='O' ) {
                d[i][j]= inf;
                x2= i, y2= j;
            }
        }
    }

    bfs();
    
    int n2, sol= 0, ri= d[x1][y1];
    if ( d[x2][y2]<ri ) {
        ri= d[x2][y2];
    }
    for ( n2= 1; n2<=ri; n2*= 2 ) {
    }
    for ( int step= n2; step>0; step/= 2 ) {
        if ( sol+step<ri && check(sol+step, x1, y1, x2, y2) ) {
            sol+= step;
        }
    }

    fout<<sol<<"\n";

    return 0;
}