Cod sursa(job #1154529)

Utilizator BlackLordFMI Alex Oprea BlackLord Data 26 martie 2014 11:18:53
Problema Barbar Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.3 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n, m, a[1010][1010], i, j, xi, yi, xf, yf, x, y, k, st, dr, mid, d[1010][1010], c[2][1000010], p, u, xa, ya, v[1010][1010];
char s[1010];
int dx[4]={-1, 0, 0, 1};
int dy[4]={0, -1, 1, 0};

void marcare(int x, int y){
    d[x][y]=1;
    p=u=1;
    c[0][p]=x;
    c[1][p]=y;
    while(p<=u)
    {
        x=c[0][p];
        y=c[1][p];
        for(int D=0; D<4; D++)
        {
            xa=x+dx[D];
            ya=y+dy[D];
            if(xa>0 && xa<=n && ya>0 && ya<=m && a[xa][ya]!=4)
            {
                if(d[xa][ya]==0 || d[xa][ya]>d[x][y]+1)
                {
                    d[xa][ya]=d[x][y]+1;
                    u++;
                    c[0][u]=xa;
                    c[1][u]=ya;
                }
            }
        }
        p++;
    }
}

int verifica(int l){
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            v[i][j]=0;
    v[xi][yi]=1;
    c[0][1]=xi;
    c[1][1]=yi;
    int p=u=1;
    while(p<=u)
    {
        x=c[0][p];
        y=c[1][p];
        for(int D=0; D<4; D++)
        {
            xa=x+dx[D];
            ya=y+dy[D];
            if(xa>0 && xa<=n && ya>0 && ya<=m && a[xa][ya]!=4 && d[xa][ya]>=l && v[xa][ya]==0)
            {
                if(xa==xf && ya==yf)
                    return 1;
                v[xa][ya]=v[x][y]+1;
                u++;
                c[0][u]=xa;
                c[1][u]=ya;
            }
        }
        p++;
    }
    return 0;
}

int main(){
    f>>n>>m;
    for(i=1; i<=n; i++)
    {
        f.get();
        f.get(s+1, 1010);
        for(j=1; j<=m; j++)
            if(s[j]=='I')
            {
                a[i][j]=1;
                xi=i;
                yi=j;
            }
            else if(s[j]=='D')
                marcare(i, j);
            else if(s[j]=='*')
                a[i][j]=4;
            else if(s[j]=='O')
            {
                a[i][j]=2;
                xf=i;
                yf=j;
            }
    }
    st=1, dr=(n>m?n:m);
    while(st<=dr)
    {
        mid=(st+dr)/2;
        if(verifica(mid)==0)
            dr=mid-1;
        else
            st=mid+1;
    }
    g<<dr-1<<"\n";
    return 0;
}