Cod sursa(job #1139508)

Utilizator classiusCobuz Andrei classius Data 11 martie 2014 11:15:19
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
//#include <iostream>
#include<fstream>
#include<queue>

using namespace std;

ifstream cin("barbar.in");
ofstream cout("barbar.out");
#define nmax 1009
queue<pair<int,int> > q;
int i,j,n,m,dist[nmax][nmax],xin,xout,yin,yout,t;
char c[nmax][nmax];
bool v[nmax][nmax];

int main()
{
    cin>>n>>m;
    for(i=1;i<=n;i++){
        for(j=1;j<=m;j++){
            dist[i][j]=5000000;
        }
    }
    for(i=1;i<=n;i++){
        cin>>(c[i]+1);
        for(j=1;j<=m;j++){
            if(c[i][j]=='I'){
                xin=i;
                yin=j;
            }else if(c[i][j]=='O'){
                xout=i;
                yout=j;
            }else if(c[i][j]=='*'){
                v[i][j]=1;
            }else if(c[i][j]=='D'){
                v[i][j]=1;
                q.push(make_pair(i,j));
                dist[i][j]=0;
            }
        }
    }
    int vec[4][2]={{0,1},{0,-1},{1,0},{-1,0}};
    #define vi i+vec[a][0]
    #define vj j+vec[a][1]
    while(!q.empty()){
        i=q.front().first;
        j=q.front().second;
        q.pop();

        for(int a=0;a<4;a++){
            if(vi>0 && vj>0 && vi<=n && vj<=m && v[vi][vj]==false && dist[vi][vj]>dist[i][j]+1){
                dist[vi][vj]=dist[i][j]+1;
                q.push(make_pair(vi,vj));
            }
        }
    }
    bool ok[1009][1009]={};
    q.push(make_pair(xin,yin));
    while(!q.empty() && ok[xout][yout]==0){
        i=q.front().first;
        j=q.front().second;
        q.pop();
        ok[i][j]=1;
        for(int a=0;a<4;a++){
            if(vi>0 && vj>0 && vi<=n && vj<m && ok[vi][vj]==0 && c[vi][vj]!='D' && c[vi][vj]!='*'){
                q.push(make_pair(vi,vj));
            }
        }
    }
    if(!ok[xout][yout]){
        cout<<-1;
        return 0;
    }
    while(!q.empty()){
        q.pop();
    }

    int dr=2001;
    int st=0;
    while(st<dr){
        int mid=(st+dr)/2;
        bool ok[1009][1009]={};
        ok[xin][yin]=1;
        q.push(make_pair(xin,yin));
        while(!q.empty()){
            i=q.front().first;
            j=q.front().second;
            q.pop();
            for(int a=0;a<4;a++){
                if(vi>0 && vj>0 && vi<=n && vj<=m && ok[vi][vj]==0 && dist[vi][vj]>mid){
                    ok[vi][vj]=1;
                    q.push(make_pair(vi,vj));
                }
            }
        }
        if(ok[xout][yout]){
            st=mid+1;
        }else{
            dr=mid;
        }
    }
    cout<<st;
    return 0;
}