Cod sursa(job #2334287)

Utilizator YetoAdrian Tonica Yeto Data 2 februarie 2019 14:41:42
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.63 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");
    st=1; dr=0;
    fin>>n>>m;
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++) {
            fin>>car;
            if (car=='.')
                a[i][j]=0;
            else
                if (car=='*') {
                    a[i][j]=2;
                    d[i][j]=-1;
                }
            else
                if (car=='I') {
                    a[i][j]=0;
                    x1=i;
                    y1=j;
                }
            else
                if (car=='O') {
                    a[i][j]=0;
                    x2=i;
                    y2=j;
                }
            if (car=='D') {
                a[i][j]=1;
                q[++dr].l=i;
                q[dr].c=j;
            }
        }
    }


    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 && d[ln][cn]==0) {
                    q[++dr].l=ln;
                    q[dr].c=cn;
                    d[ln][cn]=d[l][c]+1;
                }
        }
        st++;
    }
    /*
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++)
            fout<<d[i][j]<<" ";
        fout<<"\n";
    }
*/

    st=1;
    dr=1000;
    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 && b[x2][y2]==0) {
            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 && d[ln][cn]>=mid) {
                        q[++dr].l=ln;
                        q[dr].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;
}