Cod sursa(job #1543323)

Utilizator RaduToporanRadu Toporan RaduToporan Data 6 decembrie 2015 10:34:16
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <cstdio>
#define inf 200000000
#include<string.h>

using namespace std;
int dx[]={0, 1, 0, -1};
int dy[]={1, 0, -1, 0};
int n,m,i,j,a[1005][1005],x1,y1,x2,y2,sc,mid,st,dr,sol;

struct coada
{
    int l,c;
};
coada c[1100000];
bool ok,viz[1003][1003];

void citire()
{
    int i,j,l;
    char s[1005];
    scanf("%d%d\n",&n,&m);
    for (i=1; i<=n; i++)
    {
        scanf("%s\n",&s);
        for (j=0; j<=m-1; j++)
        if (s[j]=='I') {x1=i; y1=j+1; a[i][j+1]=inf;}
            else if (s[j]=='O') {x2=i; y2=j+1; a[i][j+1]=inf;}
                else if (s[j]=='D') { a[i][j+1]=0; sc++; c[sc].l=i; c[sc].c=j+1;}
                    else if (s[j]=='*') a[i][j+1]=-1;
                        else a[i][j+1]=inf;
    }
}

void bordare()
{
    int i,j;
    for (i=0; i<=n+1; i++)
    {
        a[i][0]=-1;
        a[i][m+1]=-1;
    }
    for (j=0; j<=m+1; j++)
    {
        a[0][j]=-1;
        a[n+1][j]=-1;
    }
}

int Lee()
{
    int ic=1;
    coada t,cx;
    while (ic<=sc)
    {
        t=c[ic];
        ic++;
        for (i=0; i<=3; i++)
            if (a[t.l+dx[i]][t.c+dy[i]]==inf)
        {
            cx.l=t.l+dx[i];
            cx.c=t.c+dy[i];
                a[cx.l][cx.c]=a[t.l][t.c]+1;
                 sc++;
                c[sc].l=cx.l;
                c[sc].c=cx.c;
            }
        }
}

bool bf(int x1, int y1, int x2, int y2, int mid)
{

    int ic=1,sc=1;
    if(a[x1][y1]<mid)
          return 0;
    memset(viz,0,sizeof(viz));
    coada t,cx;
    c[ic].l=x1;
    c[ic].c=y1;
    viz[x1][y1]=1;
    while (ic<=sc)
    {
        t=c[ic];
        ic++;
        for (i=0; i<=3; i++)
            if (a[t.l+dx[i]][t.c+dy[i]]>=mid&&viz[t.l+dx[i]][t.c+dy[i]]==0)
        {
            cx.l=t.l+dx[i];
            cx.c=t.c+dy[i];
                 sc++;
                c[sc].l=cx.l;
                c[sc].c=cx.c;
                viz[cx.l][cx.c]=1;
              if(cx.l==x2&&cx.c==y2)
                    return 1;
        }

    }
    return 0;
}



int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    citire();
    bordare();
    Lee();
    st=0;
    dr=max(m,n);
    sol=-1;
    while (st<=dr)
    {
        mid=(st+dr)/2;
        ok=bf(x1,y1,x2,y2,mid);
        if (ok==1)
        {
            sol=mid;
            st=mid+1;
        }
            else dr=mid-1;
    }
    printf("%d\n",sol);
    return 0;
}