Cod sursa(job #2320568)

Utilizator AlexPascu007Pascu Ionut Alexandru AlexPascu007 Data 14 ianuarie 2019 21:57:02
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.32 kb
#include <fstream>
#include <cstring>
#define DIM 1010
#define x first
#define y second
using namespace std;
ifstream fin ("barbar.in");
ofstream fout("barbar.out");
pair<int,int> v[DIM*DIM];
char ch[DIM][DIM];
int a[DIM][DIM],d[DIM][DIM];
int p,u,istart,jstart,istop,jstop,n,m,i,j,iv,jv,dir,st,dr,mid,ok;
int di[]={-1,1,0,0};
int dj[]={0,0,-1,1};
int main () {
    fin>>n>>m;
    for (i=1;i<=n;i++) {
        for (j=1;j<=m;j++) {
            fin>>ch[i][j];
            if (ch[i][j]=='I') {
                istart=i;
                jstart=j;
                ch[i][j]='.';
            }
            if (ch[i][j]=='O') {
                istop=i;
                jstop=j;
                ch[i][j]='.';
            }
            if (ch[i][j]=='D') {
                u++;
                v[u].x=i;
                v[u].y=j;
                a[i][j]=1;
                ch[i][j]='.';
            }
        }
    }
    p=1;
    while (p<=u) {
        for (dir=0;dir<=3;dir++) {
            iv=v[p].x+di[dir];
            jv=v[p].y+dj[dir];
            if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&ch[iv][jv]=='.'&&a[iv][jv]==0) {
                u++;
                v[u].x=iv;
                v[u].y=jv;
                a[iv][jv]=1+a[v[p].x][v[p].y];
            }
        }
        p++;
    }
    st=1, dr=a[v[u].x][v[u].y];
    while (st<=dr) {
        mid=(st+dr)/2;
        ok=0;
        if (a[istart][jstart]<mid)
            ok=0;
		else {
            memset(d,0,sizeof(d));
            p=u=1;
            d[istart][jstart]=1;
            v[1].x=istart;
            v[1].y=jstart;
            while (p<=u&&ok==0) {
                for (dir=0;dir<=3;dir++) {
                    iv=v[p].x+di[dir];
                    jv=v[p].y+dj[dir];
                    if (iv>=1&&iv<=n&&jv>=1&&jv<=m&&a[iv][jv]>=mid&&d[iv][jv]==0) {
                        u++;
                        v[u].x=iv;
                        v[u].y=jv;
                        d[iv][jv]=1;
                        if (iv==istop&&jv==jstop) {
                            ok=1;
                            break;
                        }
                    }
                }
                p++;
            }
        }
        if (ok==1)
            st=mid+1;
		else
            dr=mid-1;
    }
    fout<<dr-1;
    return 0;
}