Cod sursa(job #1629814)

Utilizator mariusn01Marius Nicoli mariusn01 Data 4 martie 2016 18:52:01
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.8 kb
#include<fstream>
#include<cstring>
#define DIM 1010
using namespace std;

struct pereche {
    int i;
    int j;
};

pereche c[DIM * DIM];

char a[DIM][DIM];
int v[DIM][DIM], x[DIM][DIM];

int p, u, iinit, jinit, ifin, jfin, n, m, i, j, iv, jv, d, di[] = {-1,1,0,0}, dj[] = {0,0,-1,1};

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] == 'I') {
                iinit = i;
                jinit = j;
                a[i][j] = '.';
            }
            if (a[i][j] == 'O') {
                ifin = i;
                jfin = j;
                a[i][j] = '.';
            }
            if (a[i][j] == 'D') {
                u++;
                c[u].i = i;
                c[u].j = j;
                v[i][j] = 1;
                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 && a[iv][jv] == '.' && v[iv][jv] == 0) {
                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++)
            fout<<v[i][j]<<" ";
        fout<<"\n";
    }

    fout.close();

*/

    int st = 1;
    int dr = v[ c[u].i  ][  c[u].j  ];

    while (st <= dr) {
        int mid = (st + dr)/2;

        //coada
        // pornesc din iinit jinit si mergand doar pe valori din v >= mid caut sa vizitez ifin jfin
        int pot = 0;
        if (v[iinit][jinit] < mid) {
            pot = 0;
        } else {
            memset(x, 0, sizeof(x));
            p = 1;
            u = 1;
            x[iinit][jinit] = 1;
            c[1].i = iinit;
            c[1].j = jinit;
            while (p <= u && pot == 0) {
                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;
        }
    }

    fout<<dr-1;
    return 0;
}