Cod sursa(job #1221996)

Utilizator rangerChihai Mihai ranger Data 21 august 2014 20:36:11
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 kb
#include<fstream>
#include<queue>
using namespace std;

ifstream cin("barbar.in");
ofstream cout("barbar.out");
const int dx[]={0,0,1,-1};
const int dy[]={1,-1,0,0};

const int nmax=1005;

int n,m,viz[nmax][nmax],dmin[nmax][nmax];

queue<pair<int, int > > q;

int Ix,Iy,Ox,Oy;

int bfs(int x)
{
    while(q.size()) q.pop();
    q.push(make_pair(Ix,Iy));
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++) viz[i][j]=0;
    viz[Ix][Iy]=1;
    while (q.size()) {
        for (int k=0;k<4;k++) {
            int xx=q.front().first+dx[k],yy=q.front().second+dy[k];
            if (xx>0&&xx<=n&&yy>0&&yy<=m) {
                if (dmin[xx][yy]>=x && viz[xx][yy]==0) {
                    q.push(make_pair(xx,yy));
                    viz[xx][yy]=1;
                }
            }
        }
        q.pop();
    }
    return (viz[Ox][Oy]);
}

void Distmin()
{
    while (!q.empty()) {
        for (int i=0;i<4;i++) {
            int xx=q.front().first+dx[i],yy=q.front().second+dy[i];
            if (xx>0&&xx<=n&&yy>0&&yy<=m)
                if (viz[xx][yy]==0)
            {
                viz[xx][yy]=1;
                dmin[xx][yy]=dmin[q.front().first][q.front().second]+1;
                q.push(make_pair(xx,yy));
            }
        }
        q.pop();
    }
}

void Read()
{
    cin>>n>>m;
    for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++) {
        char c;
        cin>>c;
        if (c=='*') dmin[i][j]=-1,viz[i][j]=1;
        if (c=='I') Ix=i,Iy=j;
        if (c=='O') Ox=i,Oy=j;
        if (c=='D') viz[i][j]=1,q.push(make_pair(i,j));
    }
}
int main()
{
    Read();
    Distmin();
    int l=0,r=n*m,sol=-1;
    while(l<=r) {
        int mij=(l+r)/2;
        if (bfs(mij)) sol=mij,l=mij+1;
         else r=mij-1;
    }

    cout<<sol;
    return 0;
}