Cod sursa(job #1614898)

Utilizator darmazDarmaz Andrei Sebastian darmaz Data 26 februarie 2016 11:46:07
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.28 kb
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;

#define NMAX 1002
#define INF (1<<30)

struct coada {
    int x,y;
};

char a[NMAX][NMAX];
coada c[NMAX*NMAX];
int d[NMAX][NMAX],viz[NMAX][NMAX];
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};

void Distances(int n, int m)
{
    int i,j,st,dr;
    coada aa,b;
    st=1;
    dr=0;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++) {
            d[i][j]=INF;
            if(a[i][j]=='D') {
                d[i][j]=0;
                c[++dr].x=i;
                c[dr].y=j;
            }
        }
    while(st<=dr) {
        aa=c[st];
        st++;
        for(i=1;i<=4;i++) {
            b.x=aa.x+dx[i];
            b.y=aa.y+dy[i];
            if(a[b.x][b.y]!='*' && d[b.x][b.y]>d[aa.x][aa.y]+1) {
                d[b.x][b.y]=d[aa.x][aa.y]+1;
                c[++dr]=b;
            }
        }
    }
}

int posibil(int n, int m, int val)
{
    int i,j,st,dr;
    coada aa,b;
    st=1;
    dr=0;
    memset(viz,0,sizeof(viz));
    for(i=0;i<=n+1;i++) {
        viz[i][0]=1;
        viz[i][m+1]=1;
    }
    for(j=0;j<=m+1;j++) {
        viz[0][j]=1;
        viz[n+1][j]=1;
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            if(a[i][j]=='I') {
                c[++dr].x=i;
                c[dr].y=j;
                viz[i][j]=1;
                if(d[i][j]<val)
                    return 0;
                break;
            }
    while(st<=dr) {
        aa=c[st];
        st++;
        for(i=1;i<=4;i++) {
            b.x=aa.x+dx[i];
            b.y=aa.y+dy[i];
            if(a[b.x][b.y]!='*' && d[b.x][b.y]>=val && viz[b.x][b.y]==0) {
                if(a[b.x][b.y]=='O')
                    return 1;
                c[++dr]=b;
                viz[b.x][b.y]=1;
            }
        }
    }
    return 0;
}

int main ()
{
    int n,m,i,p,q,mij,sol;
    ifstream f("barbar.in");
    ofstream g("barbar.out");
    f>>n>>m;
    for(i=1;i<=n;i++)
        f>>(a[i]+1);
    f.close();
    Distances(n,m);
    p=0;
    q=n+m;
    sol=-1;
    while(p<=q) {
        mij=(p+q)/2;
        if(posibil(n,m,mij)) {
            sol=mij;
            p=mij+1;
        }
        else q=mij-1;
    }
    g<<sol;
    g.close();
    return 0;
}