Cod sursa(job #1869487)

Utilizator LeVladzCiuperceanu Vlad LeVladz Data 5 februarie 2017 20:54:58
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <fstream>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

int n,m,i,j,a[1005][1005],b[1005][1005],k,c[5][1000005],t;
int istart,jstart,ifin,jfin,ic,jc,iv,jv,p,u,st,dr,mid,d,ok;
int di[] = {1,-1,0,0};
int dj[] = {0,0,1,-1};
char x;

int main()
{
    fin >> n >> m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
        {
            fin>>x;
            if (x == '*')
            {
                a[i][j] = -1;
                b[i][j] = -1;
            }
            if (x == 'D')
            {
                k++;
                c[0][k] = i;
                c[1][k] = j;
                b[i][j] = -1;
            }
            if (x == 'I')
            {
                istart = i;
                jstart = j;
            }
            if (x == 'O')
            {
                ifin = i;
                jfin = j;
            }
        }
    p = 1;
    u = k;
    while (p<=u)
    {
        ic = c[0][p];
        jc = c[1][p];
        p++;
        for (d=0;d<=3;d++)
        {
            iv = ic+di[d];
            jv = jc+dj[d];
            if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]==0)
            {
                u++;
                c[0][u] = iv;
                c[1][u] = jv;
                a[iv][jv] = a[ic][jc]+1;
                if (iv == ifin && jv == jfin)
                    t = 1;
            }
        }
    }
    st = 1;
    dr = max(n,m)*max(n,m)/2;
    while (st <= dr)
    {
        mid = (st+dr)/2;
        ok = 0;
        p = 1;
        u = 1;
        c[0][1] = istart;
        c[1][1] = jstart;
        while (p<=u)
        {
            ic = c[0][p];
            jc = c[1][p];
            for (d=0;d<=3;d++)
            {
                iv = ic+di[d];
                jv = jc+dj[d];
                if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]>=mid&&b[iv][jv]==0)
                {
                    u++;
                    c[0][u] = iv;
                    c[1][u] = jv;
                    b[iv][jv] = 1+b[ic][jc];
                    if (iv==ifin && jv==jfin)
                        ok = 1;
                }
            }
            p++;
        }
        if (ok == 1)
            st = mid+1;
        else
            dr = mid-1;
        for (i=1;i<=n;i++)
            for (j=1;j<=m;j++)
                if (b[i][j] != -1)
                    b[i][j] = 0;
    }
    if (t == 0)
    {
        fout << -1;
        return 0;
    }
    fout << dr;
    return 0;
}