Cod sursa(job #2956985)

Utilizator AndreibatmanAndrei Croitoriu Andreibatman Data 21 decembrie 2022 14:51:51
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.93 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
struct ceva
{
    int x,y;
}start,finish,p,p1;
queue<ceva>q;
int dx[]={0,-1,0,1,0};
int dy[]={0,0,1,0,-1};
int lee[1010][1010],n,m,i,st,dr,mij,viz[1010][1010],best=-1,d,j;
char mat[1010][1010];
bool in(ceva a)
{
    return a.x>=1 && a.x<=n && a.y>=1 && a.y<=m;
}
bool good(int val)
{
    if(lee[start.x][start.y]<val)
        return false;
    q.push(start);
    viz[start.x][start.y]=val;
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        for(d=1;d<=4;d++)
        {
            p1.x=p.x+dx[d];
            p1.y=p.y+dy[d];
            if(in(p1) && (mat[p1.x][p1.y]=='.' || mat[p1.x][p1.y]=='O') && lee[p1.x][p1.y]>=val && viz[p1.x][p1.y]!=val)
            {
                viz[p1.x][p1.y]=val;
                q.push(p1);
            }
        }
    }
    return viz[finish.x][finish.y]==val;
}
int main()
{
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            fin>>mat[i][j];
            lee[i][j]=1e9;
            if(mat[i][j]=='D')
            {
                q.push({i,j});
                lee[i][j]=0;
            }
            if(mat[i][j]=='I')
                start={i,j};
            if(mat[i][j]=='O')
                finish={i,j};
        }
    while(!q.empty())
    {
        p=q.front();
        q.pop();
        for(d=1;d<=4;d++)
        {
            p1.x=p.x+dx[d];
            p1.y=p.y+dy[d];
            if(in(p1) && mat[p1.x][p1.y]!='*' && lee[p1.x][p1.y]>lee[p.x][p.y]+1)
            {
                lee[p1.x][p1.y]=lee[p.x][p.y]+1;
                q.push(p1);
            }
        }
    }
    st=1;
    dr=n*m;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(good(mij))
        {
            best=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }
    fout<<best;
    return 0;
}