Cod sursa(job #423677)

Utilizator eudanipEugenie Daniel Posdarascu eudanip Data 24 martie 2010 10:12:26
Problema Barbar Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.2 kb
#include<stdio.h>
#include<string.h>

struct point
{
    int x,y;
};

point p1,p2,q[1000004];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int d[1003][1003],lim;
int viz[1003][1003];
char s[1004][1004];
int n,m,st,dr,inc,sf;

int dfs(int px,int py)
{
    int i,sx,sy,sol=0;
    viz[px][py]=1;
    if(px==p2.x && py==p2.y)
        return 1;
    for(i=0;i<4;i++)
    {
        sx=px+dx[i];
        sy=py+dy[i];
        if(sx<1 || sx>n || sy<0 || sy>=m)
            continue;
        if(d[sx][sy]<lim)
            continue;
        if(viz[sx][sy])
            continue;
        sol|=dfs(sx,sy);
    }
    return sol;
}

int main ()
{
    int i,j,px,py,sx,sy,r;
    
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;i++)
        scanf("%s",s[i]);
    for(i=1;i<=n;i++)
        for(j=0;j<m;j++)
        {
            if(s[i][j]=='D')
            {
                q[++sf].x=i;
                q[sf].y=j;
                viz[i][j]=1;
            }
            if(s[i][j]=='I')
                p1.x=i,p1.y=j;
            if(s[i][j]=='0')
                p2.x=i,p2.y=j;
        }
    //citire
    inc=1;
    while(inc<=sf)
    {
        px=q[inc].x;
        py=q[inc].y;
        if(d[px][py]>dr)
            dr=d[px][py];
        for(i=0;i<4;i++)
        {
            sx=px+dx[i];
            sy=py+dy[i];
            if(sx<1 || sx>n || sy<0 || sy>=m)
                continue;
            if(s[sx][sy]=='*')
                continue;
            if(!viz[sx][sy])
            {
                viz[sx][sy]=1;
                d[sx][sy]=d[px][py]+1;
                q[++sf].x=sx;
                q[sf].y=sy;
            }
        }
        inc++;
    }
    //bfs
    st=1;
    while(st<=dr)
    {
        lim=(st+dr)/2;
        if(d[p1.x][p1.y]<lim)
        {
            dr=lim-1;
            continue;
        }
        memset(viz,0,sizeof(viz));
        r=dfs(p1.x,p1.y);
        if(r)
            st=lim+1;
        else
            dr=lim-1;
    }
    //cautare binara+dfs
    if(!dr)
        printf("-1\n");
    else
        printf("%d\n",dr);
    return 0;
}