Cod sursa(job #2703443)

Utilizator stefantagaTaga Stefan stefantaga Data 8 februarie 2021 16:17:48
Problema Barbar Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <bits/stdc++.h>

using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
struct wow
{
    int x,y;
}acum,b,start,sfarsit;
int dl[]={1,-1,0,0};
int dc[]={0,0,1,-1};
queue <wow> q;
char ch;
int n,m,i,j,v[1005][1005],sol;
bool interior (wow a)
{
    if (1<=a.x&&a.x<=n&&1<=a.y&&a.y<=m)
    {
        return 1;
    }
    return 0;
}
int ok[1005][1005];
bool verif (int dist)
{
    queue <wow> q1;
    q1.push(start);
    memset(ok,0,sizeof(ok));
    ok[start.x][start.y]=1;
    while (!q1.empty()&&ok[sfarsit.x][sfarsit.y]==0)
    {
        acum=q1.front();
        q1.pop();
        for (i=0;i<4;i++)
        {
            b.x=acum.x+dl[i];
            b.y=acum.y+dc[i];
            if (interior(b)==1&&v[b.x][b.y]>=dist&&v[b.x][b.y]!=-1&&ok[b.x][b.y]==0)
            {
                ok[b.x][b.y]=1;
                q1.push(b);
            }
        }
    }
    if (ok[sfarsit.x][sfarsit.y]==1)
    {
        return 1;
    }
    return 0;
}
void afis (int v[1005][1005])
{
    int i,j;
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=m;j++)
        {
            g<<v[i][j]<<" ";
        }
        g<<'\n';
    }
}
int st,dr,mij;
int main()
{
    f>>n>>m;
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=m;j++)
        {
            if (v[i][j]!=-1)
            {
                v[i][j]=1e9;
            }
        }
    }
    for (i=1;i<=n;i++)
    {
        for (j=1;j<=m;j++)
        {
            f>>ch;
            if (ch=='D')
            {
                q.push(wow{i,j});
                v[i][j]=0;
            }
            else
            if (ch=='I')
            {
                start=wow{i,j};
            }
            else
            if (ch=='O')
            {
                sfarsit=wow{i,j};
            }
            else
            if (ch=='*')
            {
                ok[i][j]=-1;
            }
        }
    }
    while (!q.empty())
    {
        acum=q.front();
        q.pop();
        for (i=0;i<4;i++)
        {
            b.x=acum.x+dl[i];
            b.y=acum.y+dc[i];
            if (v[b.x][b.y]!=-1&&v[b.x][b.y]>v[acum.x][acum.y]+1)
            {
                v[b.x][b.y]=v[acum.x][acum.y]+1;
                q.push(b);
            }
        }
    }
    st=1;
    dr=n*m;
    while (st<=dr)
    {
        mij=(st+dr)/2;
        if (verif(mij)==1)
        {
            sol=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    g<<sol;
    return 0;
}