Cod sursa(job #1845246)

Utilizator Walrus21andrei Walrus21 Data 11 ianuarie 2017 05:30:36
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.29 kb
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#define N 1001

using namespace std;

struct ps
{
    int l;
    int c;
};

int i, j, n, m, p, u, nmx, D[N][N];
ps pi, pf, v, C[N*N];
int dl[] ={-1, 0, 1, 0}, dc[] = {0, 1, 0, -1};
bool ok, o[N][N];
char c;

void mx(ps pi, int r)
{
    if(pi.l == pf.l && pi.c == pf.c) ok = 1;
    o[pi.l][pi.c] = 1;
    for(int k = 0; k < 4; k++)
    {
        v.l = pi.l + dl[k];
        v.c = pi.c + dc[k];
        if(!o[v.l][v.c] && D[v.l][v.c] >= r)
            mx(v, r);
    }
}

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')
                {
                    pi.l = i;
                    pi.c = j;
                }
            else
                if(c == 'O')
                {
                    pf.l = i;
                    pf.c = 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;
                C[++u] = v;
            }
        }
    int l = 1, r = N*N, mid;
    {
        while(l <= r)
        {
            mid = (l + r) / 2;
            if(D[pi.l][pi.c] < mid)
                r = mid - 1;
            else
            {
                ok = 0;
                memset(o, 0, sizeof(o));
                mx(pi, mid);
                if(ok)
                {
                    l = mid + 1;
                    nmx = mid;
                }
                else r = mid - 1;
            }
        }
    }
    printf("%d\n", nmx - 1);
    return 0;
}