Cod sursa(job #2361993)

Utilizator greelioGreenio Greely greelio Data 2 martie 2019 21:05:52
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.63 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;
            }
        }
    }

    Q.push({x11,y11}); M[x11][y11]=b[x11][y11];
    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' && a[i2][j2]!='*' && (!M[i2][j2] || min(M[i][j], b[i2][j2])>M[i2][j2])) {
                M[i2][j2]=min(M[i][j],b[i2][j2]);
                if (!u[i2][j2]) Q.push({i2,j2}), u[i2][j2]=1;
            }
        }
    } cout<<M[x2][y2];

    return 0;
}