Cod sursa(job #2543229)

Utilizator Iulia_DianaIulia Diana Iulia_Diana Data 10 februarie 2020 22:46:40
Problema Barbar Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.82 kb
#include <iostream>
#include <fstream>
#include <deque>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, i, j, aux[1005][1005], x[4]={1, -1, 0, 0}, y[4]={0, 0, 1, -1}, maxx=0, st, dr, mij, lin1, col1, lin2, o, col2;
int a[1005][1005];
char sir[1005][1005];
deque <int> dx;
deque <int> dy;
void modif()
{
    int i, j;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
            if(a[i][j]!=-1) a[i][j]=0;
}
void resett()
{
    int i;
    for(i=0; i<=m+1; i++)
    {
        aux[0][i]=-1;
        aux[n+1][i]=-1;
        a[0][i]=-1;
        a[n+1][i]=-1;
    }
    for(i=1; i<=n; i++)
    {
        aux[i][0]=-1;
        aux[i][m+1]=-1;
        a[i][0]=-1;
        a[i][m+1]=-1;
    }
}
void filll()
{
    int l, c, o;
    while(!dx.empty())
    {
        l=dx.front();
        c=dy.front();
        for(o=0; o<=3; o++)
        {
            if(aux[l+x[o]][c+y[o]]==0)
            {
                dx.push_back(l+x[o]);
                dy.push_back(c+y[o]);
                aux[l+x[o]][c+y[o]]=aux[l][c]+1;
            }
            else
                if(aux[l+x[o]][c+y[o]]>aux[l][c]+1)
                {
                     dx.push_back(l+x[o]);
                     dy.push_back(c+y[o]);
                     aux[l+x[o]][c+y[o]]=aux[l][c]+1;
                }
        }
        if(aux[l][c]>maxx)   maxx=aux[l][c];
        dx.pop_front();
        dy.pop_front();
    }
}
void lee2(int l, int c)
{
    dx.push_back(l);
    dy.push_back(c);
    while(!dx.empty())
    {
        l=dx.front();
        c=dy.front();
        for(o=0; o<=3; o++)
            if(a[l+x[o]][c+y[o]]==0 && (aux[l+x[0]][c+y[o]]-1>=mij || (l==lin2 && c==col2)) && a[l+x[0]][c+y[o]]!=-1)
            {
                a[l+x[o]][c+y[o]]=a[l][c]+1;
                dx.push_back(l+x[o]);
                dy.push_back(c+y[o]);
            }
        dx.pop_front();
        dy.pop_front();
    }

}
int main()
{
    fin >> n >> m;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            fin >> sir[i][j];
            if(sir[i][j]=='D')
            {
                dx.push_back(i);
                dy.push_back(j);
                aux[i][j]=1;
                a[i][j]=-1;
            }
            if(sir[i][j]=='I')
            {
                lin1=i;
                col1=j;
            }
             if(sir[i][j]=='O')
            {
                lin2=i;
                col2=j;
            }
        }
    resett();
    filll();
    st=1; dr=maxx;
    while(st<=dr)
    {
        mij=(st+dr)/2;
        modif();
        a[lin1][col1]=1;
        lee2(lin1, col1);
        if(a[lin2][col2])
        {
            maxx=mij;
            st=mij+1;
        }
        else dr=mij-1;
    }

    fout << maxx;
    return 0;
}