Cod sursa(job #2161239)

Utilizator catalina200029Olteanu Catalina catalina200029 Data 11 martie 2018 16:18:07
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("barbar.in");
ofstream g("barbar.out");

queue<pair<int,int>> d;

int n,a[1005][1005],m,xs,ys,xf,yf,p,b[1005][1005];
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};

int main() {
    int i,j,x,y;
    char c;
    f>>n>>m;
    for (i=1;i<=n;i++)
        for (j=1;j<=m;j++) {
            f>>c;
            if (c=='I') {
                xs=i;
                ys=j;
            }
            else if (c=='O') {
                xf=i;
                yf=j;
            }
            else if (c=='*') a[i][j]=b[i][j]=-1;
            else if (c=='D') {
                a[i][j]=1;
                d.push(make_pair(i,j));
            }
        }
    while(!d.empty()) {
        x=d.front().first;
        y=d.front().second;
        d.pop();
        for (i=0;i<4;i++)
            if (x+dx[i]>=1 && x+dx[i]<=n && y+dy[i]>=1 && y+dy[i]<=m && a[x+dx[i]][y+dy[i]]==0) {
                a[x+dx[i]][y+dy[i]]=a[x][y]+1;
                //cout<<x+dx[i]<<' '<<y+dy[i]<<'\n';
                d.push(make_pair(x+dx[i],y+dy[i]));
            }
    }/*
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++)
            cout<<a[i][j]<<' ';
        cout<<'\n';
    }
    cout<<'\n';*/
    d.push(make_pair(xs,ys));
    b[xs][ys]=a[xs][ys];
    while (!d.empty()) {
        x=d.front().first;
        y=d.front().second;
        d.pop();
        for (i=0;i<4;i++)
            if (x+dx[i]>=1 && x+dx[i]<=n && y+dy[i]>=1 && y+dy[i]<=m && b[x+dx[i]][y+dy[i]]!=-1
            && b[x+dx[i]][y+dy[i]]<min(b[x][y],a[x+dx[i]][y+dy[i]])) {
                b[x+dx[i]][y+dy[i]]=min(b[x][y],a[x+dx[i]][y+dy[i]]);
                d.push(make_pair(x+dx[i],y+dy[i]));
            }
    }/*
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++)
            cout<<b[i][j]<<' ';
        cout<<'\n';
    }*/
    if (b[xf][yf]) g<<b[xf][yf]-1;
    else g<<"-1";
    return 0;
}