Cod sursa(job #2158667)

Utilizator mateibanuBanu Matei Costin mateibanu Data 10 martie 2018 15:04:00
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <bits/stdc++.h>

using namespace std;

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

class InParser {
private:
    FILE *fin;
    char *buff;
    int sp;

    char read_ch() {
        ++sp;
        if (sp == 4096) {
            sp = 0;
            fread(buff, 1, 4096, fin);
        }
        return buff[sp];
    }

public:
    InParser(const char* nume) {
        fin = fopen(nume, "r");
        buff = new char[4096]();
        sp = 4095;
    }

    InParser& operator >> (int &n) {
        char c;
        while (!isdigit(c = read_ch()) && c != '-');
        int sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }

    InParser& operator >> (long long &n) {
        char c;
        n = 0;
        while (!isdigit(c = read_ch()) && c != '-');
        long long sgn = 1;
        if (c == '-') {
            n = 0;
            sgn = -1;
        } else {
            n = c - '0';
        }
        while (isdigit(c = read_ch())) {
            n = 10 * n + c - '0';
        }
        n *= sgn;
        return *this;
    }

    InParser& operator >> (char &n) {
        char c='\n';
        while (c == '\n') c = read_ch();
        n=c;
        return *this;
    }
};

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

int main()
{
    InParser fin("barbar.in");
    freopen("barbar.out","w",stdout);

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

    fin>>n>>m;

    for (i=1;i<=n;i++){
        for (j=1;j<=m;j++){
            fin>>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;}
        }
    }
    for (i=0;i<=n+1;i++) {a[i][0]=-1;a[i][m+1]=-1;}
    for (i=0;i<=m+1;i++) {a[0][i]=-1;a[n+1][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;
}