Cod sursa(job #2362026)

Utilizator greelioGreenio Greely greelio Data 2 martie 2019 21:23:37
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.88 kb
#include<bits/stdc++.h>
#define N 1010
#define pii pair<int,int>
#define fi first
#define se second

using namespace std;


int dx[]={1,0,-1,0};
int dy[]={0,1,0,-1};
int n,m,x11,y11,x2,y2;
char a[N][N];
int M[N][N], b[N][N];
bool u[N][N];
queue<pii>Q;

bool OK(int i, int j) {
    return (i>=1 && j>=1 && i<=n && j<=m);
}
int main() {
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin>>n>>m;
    for (int i=1; i<=n; ++i) {
        for (int j=1; j<=m; ++j) {
            cin>>a[i][j];
            if (a[i][j]=='I') x11=i,y11=j;
            else if (a[i][j]=='O') x2=i, y2=j;
            else if (a[i][j]=='D') Q.push({i,j});
        }
    }
    while (Q.size()) {
        int i=Q.front().fi;
        int j=Q.front().se;
        Q.pop(); u[i][j]=0;
        for (int d=0; d<4; ++d) {
            int i2=i+dx[d];
            int j2=j+dy[d];
            if (OK(i2,j2) && a[i2][j2]!='D' && (!b[i2][j2] || b[i2][j2]>b[i][j]+1)) {
                b[i2][j2]=b[i][j]+1;
                if (!u[i2][j2]) Q.push({i2,j2}), u[i2][j2]=1;
            }
        }
    }
    int st=min(b[x11][y11],b[x2][y2]), dr=n*m;
    bool v=0;
    while (st<=dr) {
        int mid=(st+dr)/2;
        Q.push({x11,y11}); M[x11][y11]=1;
        while (Q.size()) {
            int i=Q.front().fi;
            int j=Q.front().se; Q.pop();
            for (int d=0; d<4; ++d) {
                int i2=i+dx[d];
                int j2=j+dy[d];
                if (OK(i2,j2) && a[i2][j2]!='D' && a[i2][j2]!='*' && !M[i2][j2] && b[i2][j2]>=mid) {
                    M[i2][j2]=1;
                    Q.push({i2,j2});
                }
            }
        }
        if (M[x2][y2]) st=mid+1, v=1;
        else dr=mid-1;
        for (int i=1; i<=n; ++i)
            for (int j=1; j<=m; ++j) M[i][j]=0;
    }
    if (v) cout<<st-1;
    else cout<<"-1";

    return 0;
}