Cod sursa(job #2958649)

Utilizator biancalautaruBianca Lautaru biancalautaru Data 27 decembrie 2022 15:04:47
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.02 kb
#include <fstream>
#include <cstring>
#define DIM 1001
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,p,u,x1,y1,x2,y2,st,dr,sol,a[DIM][DIM];
int di[]={-1,0,0,1},dj[]={0,-1,1,0};
bool viz[DIM][DIM];
char ch;
struct punct {
    int x,y;
}q[DIM*DIM];

bool inauntru(int i,int j) {
    return i>=1 && i<=n && j>=1 && j<=m;
}

int main() {
    fin>>n>>m;
    p=1;
    u=0;
    for (int i=1;i<=n;i++)
        for (int j=1;j<=m;j++) {
            fin>>ch;
            if (ch=='*')
                a[i][j]=-1;
            else
                if (ch=='D') {
                    q[++u]={i,j};
                    a[i][j]=1;
                }
                else
                    if (ch=='I')
                        x1=i,y1=j;
                    else
                        if (ch=='O')
                            x2=i,y2=j;
        }
    while (p<=u) {
        int i=q[p].x;
        int j=q[p].y;
        p++;
        for (int d=0;d<4;d++) {
            int ic=i+di[d];
            int jc=j+dj[d];
            if (inauntru(ic,jc) && a[ic][jc]==0) {
                q[++u]={ic,jc};
                a[ic][jc]=a[i][j]+1;
            }
        }
    }
    sol=-1;
    st=1;
    dr=n*m;
    while (st<=dr) {
        int mid=(st+dr)/2;
        if (a[x1][y1]<mid) {
            dr=mid-1;
            continue;
        }
        memset(viz,0,sizeof(viz));
        p=u=1;
        q[1]={x1,y1};
        viz[x1][y1]=1;
        while (p<=u) {
            int i=q[p].x;
            int j=q[p].y;
            p++;
            for (int d=0;d<4;d++) {
                int ic=i+di[d];
                int jc=j+dj[d];
                if (inauntru(ic,jc) && a[ic][jc]>=mid && viz[ic][jc]==0) {
                    q[++u]={ic,jc};
                    viz[ic][jc]=1;
                }
            }
        }
        if (viz[x2][y2]==1) {
            st=mid+1;
            sol=mid-1;
        }
        else
            dr=mid-1;
    }
    fout<<sol;
    return 0;
}