Cod sursa(job #2296203)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 4 decembrie 2018 16:04:53
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.78 kb
#include <iostream>
#include <fstream>
#include <queue>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,a[1005][1005],maxim;
int dx[]={-1,1,0,0};
int dy[]={0,0,1,-1};
bool b[1005][1005];
queue < pair<int,int> > Coada;
pair <int,int> start,finish;
char x;
int nr;
void BFS()
{
    int p,q,i;
    while(!Coada.empty())
    {
        p=Coada.front().first;
        q=Coada.front().second;
        Coada.pop();
        for(i=0;i<4;i++)
        {
            if(a[p+dx[i]][q+dy[i]]==0)
            {
                if(a[p][q]==-1)
                {
                    a[p+dx[i]][q+dy[i]]=1;
                }
                else
                {
                    a[p+dx[i]][q+dy[i]]=a[p][q]+1;
                }
                if(a[p+dx[i]][q+dy[i]]>maxim)
                {
                    maxim=a[p+dx[i]][q+dy[i]];
                }
                Coada.push(make_pair(p+dx[i],q+dy[i]));
            }
        }
    }
}
bool verificare(int d)
{
    int p,q,i,j;
    if(a[start.first][start.second]<d)
    {
        return 0;
    }
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            b[i][j]=0;
        }
    }
    Coada.push(start);
    while(!Coada.empty() && b[finish.first][finish.second]==0)
    {
        p=Coada.front().first;
        q=Coada.front().second;
        Coada.pop();
        for(i=0;i<4;i++)
        {
            if(b[p+dx[i]][q+dy[i]]==0 && a[p+dx[i]][q+dy[i]]>=d)
            {
                b[p+dx[i]][q+dy[i]]=1;
                Coada.push(make_pair(p+dx[i],q+dy[i]));
            }
        }
    }
    while(!Coada.empty())
    {
        Coada.pop();
    }
    if(b[finish.first][finish.second]==1)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
int main()
{
    int i,j,st,dr,val,mij;
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            f>>x;
            if(x=='I')
            {
                start=make_pair(i,j);
            }
            if(x=='D')
            {
                a[i][j]=-1;
                Coada.push(make_pair(i,j));
            }
            if(x=='*')
            {
                a[i][j]=-1;
            }
            if(x=='O')
            {
                finish=make_pair(i,j);
            }
        }
    }
    for(i=0;i<=n+1;i++)
    {
        a[i][0]=a[i][m+1]=-1;
    }
    for(i=0;i<=m+1;i++)
    {
        a[0][i]=a[n+1][i]=-1;
    }
    BFS();
    st=1;
    dr=maxim;
    val=-1;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        if(verificare(mij)==1)
        {
            val=mij;
            st=mij+1;
        }
        else
        {
            dr=mij-1;
        }
    }
    g<<val;
    return 0;
}