Cod sursa(job #2158139)

Utilizator mateibanuBanu Matei Costin mateibanu Data 10 martie 2018 10:54:37
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include <bits/stdc++.h>

using namespace std;

#define f first
#define s second
#define mp make_pair
#define ll long long

ll a[1010][1010],d[1010][1010],dx[]={0,1,0,-1},dy[]={1,0,-1,0};
queue<pair<ll,ll> >q;

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);

    ll n,m,i,j,xo,yo,xd,yd,x,y;
    char c;

    scanf("%lld%lld\n",&n,&m);

    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            scanf("%c",&c);
            if (c=='I') {xo=i;yo=j;}
            if (c=='*') a[i][j]=-1;
            if (c=='O') {xd=i;yd=j;}
            if (c=='D') {q.push(mp(i,j));d[i][j]=1;}
        }
        scanf("\n");
    }
    for (i=0;i<=n+1;i++) {a[i][0]=-1;a[i][m]=-1;}
    for (i=0;i<=m+1;i++) {a[0][i]=-1;a[n][i]=-1;}

    while (!q.empty()){
        x=q.front().f;
        y=q.front().s;
        q.pop();
        for (i=0;i<4;i++){
            if (a[x+dx[i]][y+dy[i]]!=-1&&d[x+dx[i]][y+dy[i]]==0){
                d[x+dx[i]][y+dy[i]]=d[x][y]+1;
                q.push(mp(x+dx[i],y+dy[i]));
            }
        }
    }

    q.push(mp(xo,yo));
    a[xo][yo]=d[xo][yo];
    while (!q.empty()){
        x=q.front().f;
        y=q.front().s;
        q.pop();
        for (i=0;i<4;i++){
            if (a[x+dx[i]][y+dy[i]]!=-1&&a[x+dx[i]][y+dy[i]]<min(d[x+dx[i]][y+dy[i]],a[x][y])){
                a[x+dx[i]][y+dy[i]]=min(d[x+dx[i]][y+dy[i]],a[x][y]);
                q.push(mp(x+dx[i],y+dy[i]));
            }
        }
    }

    printf("%lld",a[xd][yd]-1);
    return 0;
}