Cod sursa(job #1125288)

Utilizator alecsandrualex cuturela alecsandru Data 26 februarie 2014 16:45:10
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.97 kb
#include<cstdio>
#include<queue>
#include<algorithm>
using namespace std;
struct POINT
{
    int x,y;
};
POINT tata,fiu;
queue <POINT> q;
int n,m,i,j,d[1010][1010],dx[]={0,-1,0,1,0},dy[]={0,0,1,0,-1},xs,ys;
char harta[1010][1010];
bool viz[1010][1010];
bool inside(int x,int y)
{
    return 0<x&&x<=n&&0<y&&y<=m;
}
bool drum(int ok)
{
    bool answer=false;
    tata.x=xs;
    tata.y=ys;
    q.push(tata);
    while(!q.empty())
    {
        tata=q.front();
        //printf("%d %d %d\n",tata.x,tata.y,d[tata.x][tata.y]);
        for(i=1;i<=4;i++)
        {
             fiu.x=tata.x+dx[i];
            fiu.y=tata.y+dy[i];
            if((harta[fiu.x][fiu.y]=='.'||harta[fiu.x][fiu.y]=='D')&&inside(fiu.x,fiu.y)==true&&viz[fiu.x][fiu.y]==false&&ok<=d[fiu.x][fiu.y])
            {
                q.push(fiu);
                viz[fiu.x][fiu.y]=true;
            }
            if(harta[fiu.x][fiu.y]=='O')
            {
                answer=true;
                break;
            }
        }
        q.pop();
    }
    while(!q.empty())
    {
        q.pop();
    }
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            viz[i][j]=0;
    return answer;
}
void bs(int st,int dr)
{
    int med,last=-1;
    while(st<=dr)
    {
        med=((dr-st)>>1)+st;
        if(drum(med)==true)
        {
            last=med;
            st=med+1;
        }
        else
            dr=med-1;
    }
    printf("%d",last);
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            scanf("%c",&harta[i][j]);
            d[i][j]=-1;
            if(harta[i][j]=='D')
            {
                tata.x=i;
                tata.y=j;
                d[i][j]=0;
                q.push(tata);
            }
            if(harta[i][j]=='*')
            {
                d[i][j]=-2;
            }
            if(harta[i][j]=='I')
            {
                xs=i;
                ys=j;
            }
        }
        scanf("\n");
    }
    /*for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            printf("%c",harta[i][j]);
        }
        printf("\n");
    }*/
    while(!q.empty())
    {
        tata=q.front();
        for(i=1;i<=4;i++)
        {
            fiu.x=tata.x+dx[i];
            fiu.y=tata.y+dy[i];
            if(d[fiu.x][fiu.y]==-1&&inside(fiu.x,fiu.y)==true)
            {
                d[fiu.x][fiu.y]=d[tata.x][tata.y]+1;
                if(d[tata.x][tata.y]==0)
                    d[fiu.x][fiu.y]=1;
                q.push(fiu);
            }
        }
        q.pop();
    }
    /*for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(d[i][j]<0)
                printf(" %d",d[i][j]);
            else
                printf("  %d",d[i][j]);
        }
        printf("\n");
    }*/
    bs(0,max(m,n));
    return 0;
}