Cod sursa(job #1333437)

Utilizator wGEORGEWGeorge Cioti wGEORGEW Data 3 februarie 2015 10:00:10
Problema Barbar Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.95 kb
#include <fstream>
#include <cstring>
#define DIM 1005
 
using namespace std;
 
ifstream fin("barbar.in");
ofstream fout("barbar.out");
 
int N,D[DIM][DIM],M,I,C,p,u,sol,F,T;
bool viz[DIM][DIM];
struct coada {int x,y;}Coada[DIM*DIM];
char x;
const int di[]={1,0,-1,0},dj[]={0,1,0,-1};
int Lee(int val){
    if(D[I][C]<val)
        return 0;
    int p,u;
    p=u=1;
    memset(viz,0,sizeof(viz));
    Coada[1].x=I;
    Coada[1].y=C;
    viz[I][C]=1;
    while(p<=u){
        coada b=Coada[p++];
        for(int i=0;i<4;i++){
            coada k;
            k.x=b.x+di[i];
            k.y=b.y+dj[i];
            if(k.x>=1 && k.x<=N && k.y>=1 && k.y<=M && !viz[k.x][k.y] && D[k.x][k.y]>=val){
                Coada[++u]=k;
                viz[k.x][k.y]=1;
                if(k.x==F && k.y==T)
                    return 1;
            }
        }
    }
    return 0;
}
int main(){
    fin>>N>>M;
    for(int i=1;i<=N;i++)
        for(int j=1;j<=M;j++){
            fin>>x;
            if(x=='I'){
                I=i;
                C=i;
            }
            if(x=='D'){
                Coada[++u].x=i;
                Coada[u].y=j;
                D[i][j]=1;
            }
            if(x=='*'){
                D[i][j]=-1;
            }
            if(x=='O'){
                F=i;
                T=j;
            }
        }
    p=1;
    while(p<=u){
        coada b=Coada[p++];
        for(int i=0;i<4;i++){
            coada k;
            k.x=b.x+di[i];
            k.y=b.y+dj[i];
            if(k.x>=1 && k.x<=N && k.y>=1 && k.y<=M && !D[k.x][k.y]){
                D[k.x][k.y]=D[b.x][b.y]+1;
                Coada[++u]=k;
            }
        }
    }
    p=1;
    u=DIM*DIM;
    while(p<=u){
        int mid=(p+u)>>1;
        if(Lee(mid)){
            p=mid+1;
            sol=mid;
        }
        else
            u=mid-1;
    }
    fout<<sol-1;
    fin.close();fout.close();
    return 0;
}