Cod sursa(job #2334274)

Utilizator YetoAdrian Tonica Yeto Data 2 februarie 2019 14:21:43
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.66 kb
#include <fstream>
#include <cstring>
using namespace std;
int n, m, i, j, st, dr, x1, y1, x2, y2, st1, dr1, sol, ok;
int a[1001][1001], d[1001][1001], b[1001][1001];
int dx[] = {0, 0, 1, 0, -1};
int dy[] = {0, 1, 0, -1, 0};
struct codau {
    int l, c;
}q[1000000];
char car;

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>>car;
            if (car=='*') {
                a[i][j]=-1;
            }
            if (car=='I') {
                a[i][j]=1;
                x1=i;
                y1=j;
            }
            if (car=='O') {
                a[i][j]=2;
                x2=i;
                y2=j;
            }
            if (car=='D') {
                a[i][j]=3;
            }
        }
    }
/*
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++)
            fout<<a[i][j]<<" ";
        fout<<"\n";
    }*/

    st=1; dr=0;
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++) {
            if (a[i][j]==3) {
                q[++dr].l=i;
                q[dr].c=j;
                d[i][j]=1;
            }
        }
    }

    while (st<=dr) {
        int l=q[st].l;
        int c=q[st].c;
        for (i=1;i<=4;i++) {
            int ln=l+dx[i];
            int cn=c+dy[i];
            if (ln>=1 && ln<=n && cn>=1 && cn<=m)
                if ((a[ln][cn]==0 || a[ln][cn]==2 || a[ln][cn]==1) && d[ln][cn]==0) {
                    q[++dr].l=ln;
                    q[dr].c=cn;
                    d[ln][cn]=d[l][c]+1;
                }
        }
        st++;
    }

    st=1;
    dr=2000;
    while (st<=dr) {
        int mid = (st+dr)/2;
        ok=1;
        memset (b, 0, sizeof(b));
        st1=1;
        dr1=1;
        q[st1].l=x1;
        q[st1].c=y1;
        if (d[x1][y1]<mid) {
            ok=0;
        }
        b[x1][y1]=1;
        while (st1<=dr1) {
            int l=q[st1].l;
            int c=q[st1].c;
            for (i=1;i<=4;i++) {
                int ln=l+dx[i];
                int cn=c+dy[i];
                if (ln>=1 && ln<=n && cn>=1 && cn<=m)
                    if (a[ln][cn]==0 && b[ln][cn]==0) {
                        if (d[ln][cn]>=mid) {
                            q[++dr1].l=ln;
                            q[dr1].c=cn;
                            b[ln][cn]=1;
                        } else
                            ok=0;
                    }
            }
            st1++;
        }

        if (ok==1) {
            sol=mid;
            st=mid+1;
        }else
            dr=mid-1;
    }

    fout<<sol;
    return 0;
}