Cod sursa(job #1629622)

Utilizator mariusn01Marius Nicoli mariusn01 Data 4 martie 2016 17:05:05
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <fstream>
#include <cstring>

#define DIM 1010
using namespace std;

struct pereche {
    int i;
    int j;
};

char a[DIM][DIM];
int v[DIM][DIM];
pereche c[DIM*DIM];
int p, u, i, j, n, m, ifin, jfin, iinit, jinit, d, iv, jv, di[] = {-1,1,0,0}, dj[] = {0,0,-1,1};
int x[DIM][DIM];

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

    fin>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++) {
            fin>>a[i][j];
            if (a[i][j] == 'D') {
                u++;
                c[u].i = i;
                c[u].j = j;
                v[i][j] = 1;
                a[i][j] = '.';
            }
            if (a[i][j] == 'I') {
                iinit = i;
                jinit = j;
                a[i][j] = '.';
            }
            if (a[i][j] == 'O') {
                ifin = i;
                jfin = j;
                a[i][j] = '.';
            }
        }

    p = 1;
    while (p <= u) {
        for (d = 0; d <= 3; d++) {
            iv = c[p].i + di[d];
            jv = c[p].j + dj[d];
            if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && v[iv][jv] == 0 && a[iv][jv] != '*'){
                u++;
                c[u].i = iv;
                c[u].j = jv;
                v[iv][jv] = 1 + v[ c[p].i ][ c[p].j ];
            }
        }
        p++;
    }

    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++)
            if (a[i][j] == '*')
                v[i][j] = -1;

/*
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++)
            fout<<v[i][j]<<" ";
        fout<<"\n";
    }
*/
    int st = 0, pot;
    int dr = v[ c[u].i ][ c[u].j ];
    while (st <= dr) {
        int mid = (st + dr)/2;

        // pornesc din iinit, jinit si incerc sa ating ifin, jfin vizitand doar elemente
        // din v cu valori >= mid

        if (v[ iinit ][jinit] < mid)
            pot = 0;
        else {
            pot = 0;
            p = 1;
            u = 1;
            c[1].i = iinit;
            c[1].j = jinit;
            memset(x, 0, sizeof(x));
            x[iinit][jinit] = 1;
            while (p <= u && !pot) {
                for (d = 0;d <= 3; d++) {
                    iv = c[p].i + di[d];
                    jv = c[p].j + dj[d];
                    if (iv >= 1 && iv <= n && jv >= 1 && jv <= m && v[iv][jv] >= mid && x[iv][jv] == 0) {
                        u++;
                        c[u].i = iv;
                        c[u].j = jv;
                        x[iv][jv] = 1;
                        if (iv == ifin && jv == jfin) {
                            pot = 1;
                            break;
                        }
                    }
                }
                p++;
            }


        }

        if (pot) {
            st = mid + 1;
        } else {
            dr = mid - 1;
        }
    }
    if (dr - 1 >= 0)
        fout<<dr-1<<"\n";
    else
        fout<<-1;
    return 0;
}