Cod sursa(job #1845346)

Utilizator Walrus21andrei Walrus21 Data 11 ianuarie 2017 13:11:35
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.7 kb
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#define NMAX 1007

using namespace std;

struct ps
{
    int l;
    int c;
};

int i, j, n, m, pil, pic, pfl, pfc, p, u, l ,r, mid, nmx, D[NMAX][NMAX];
ps pi, pf, v, C[NMAX * NMAX];
int dl[] ={-1, 0, 1, 0}, dc[] = {0, 1, 0, -1};
bool ok, o[NMAX][NMAX];
char c;

void mx(int pii, int pij, int rr)
{
    int vvi, vvj;
    o[pii][pij] = 1;
    p = u = 1;
    memset(C, 0, sizeof(C));
    C[1].l = pii;
    C[1].c = pij;
    while(p <= u)
    {
        if(C[p].l == pfl && C[p].c == pfc) {ok = 1; break;}
        for(int k = 0; k < 4; k++)
        {
            vvi = C[p].l + dl[k];
            vvj = C[p].c + dc[k];
            if(!o[vvi][vvj] && D[vvi][vvj] >= rr)
            {
                u++;
                C[u].l = vvi;
                C[u].c = vvj;
                o[vvi][vvj] = 1;
            }
        }
        p++;
    }
}

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", &c);
            if(c == '*')
                D[i][j] = -1;
            else if(c == 'D')
            {
                u++;
                C[u].l = i;
                C[u].c = j;
                D[i][j] = 1;
            }
            else
                if(c == 'I')
                {
                    pil = i;
                    pic = j;
                }
            else
                if(c == 'O')
                {
                    pfl = i;
                    pfc = j;
                }
        }
        scanf("\n");
    }

    for(i = 1; i <= m; i++)
        D[0][i] = D[n + 1][i] = -1;
    for(i = 1; i <= n; i++)
        D[i][0] = D[i][m + 1] = -1;

    while(p <= u)
    {

        for(int k = 0; k < 4; k++)
        {
            v.l = C[p].l + dl[k];
            v.c = C[p].c + dc[k];

            if(!D[v.l][v.c])
            {
                D[v.l][v.c] = D[C[p].l][C[p].c] + 1;

                u++;
                C[u] = v;
            }
        }

     p++;

    }

    l=1; r=n*m;
            while(l <= r)
        {
            mid = (l + r) / 2;
            if(D[pil][pic] < mid)
                r = mid - 1;
            else
            {
                ok = 0;
                memset(o, 0, sizeof(o));
                mx(pil, pic, mid);
                if(ok)
                {
                    l = mid + 1;
                    nmx = mid;
                }
                else r = mid - 1;
            }
        }

    printf("%d\n", nmx - 1);
    return 0;
}