Cod sursa(job #2081114)

Utilizator biaiftimeIftime Bianca biaiftime Data 3 decembrie 2017 23:43:13
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.5 kb
#include <fstream>
#include <queue>
#define Nmax 1010
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int a[Nmax][Nmax],n,m,xi,yi,xf,yf;
int nrmax;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int viz[Nmax][Nmax];
queue<int>cdx,cdy;
void Bordare()
{
    int i,j;
    for(i=0;i<=n+1;++i)a[i][0]=a[i][m+1]=-1;
    for(j=0;j<=m+1;++j)a[0][j]=a[n+1][j]=-1;
}
void Dragon()
{
    int i,xc,yc,xv,yv;
    while(!cdx.empty())
    {
        xc=cdx.front(); yc=cdy.front();
        cdx.pop(); cdy.pop();
        for(i=0;i<4;++i)
        {
            xv=xc+dx[i];
            yv=yc+dy[i];
            if(viz[xv][yv]==0&&((a[xc][yc]+1<a[xv][yv]&&a[xv][yv]!=-1)||a[xv][yv]==0))
            {
                a[xv][yv]=a[xc][yc]+1;
                nrmax=max(a[xv][yv],nrmax);
                viz[xv][yv]=1;
                cdx.push(xv);
                cdy.push(yv);
            }
        }
    }
}
void Read()
{
    int i,j;
    char s[Nmax];
    fin>>n>>m;
    Bordare();
    for(i=1;i<=n;++i)
    {
        fin>>s;
        for(j=0;j<m;++j)
        {
            if(s[j]=='*')a[i][j+1]=-1;
            else if(s[j]=='I'){xi=i; yi=j+1; }
            else if(s[j]=='O'){xf=i; yf=j+1; }
            else if(s[j]=='D'){a[i][j+1]=1;cdx.push(i);cdy.push(j+1);viz[i][j+1]=1; }
        }
    }
}
int Lee(int dist)
{
    queue<int>c1,c2;
    int i,xc,yc,xv,yv,j;
    for(i=0;i<=n+1;++i)
     for(j=0;j<=m+1;++j)
      viz[i][j]=0;
    c1.push(xi); c2.push(yi);
    viz[xi][yi]=1;
    while(!c1.empty()&&viz[xf][yf]==0)
    {
        xc=c1.front(); yc=c2.front();
        c1.pop(); c2.pop();
        for(i=0;i<4;++i)
        {
            xv=xc+dx[i];
            yv=yc+dy[i];
            if(xv==xf&&yv==yf)return 1;
            if(viz[xv][yv]==0&&a[xv][yv]>=dist)
            {
                viz[xv][yv]=1;
                c1.push(xv);
                c2.push(yv);
            }
        }
    }
    return 0;
}
int CautareBinara(int s,int d)
{
    if(s<=d)
    {
        int m=s+(d-s)/2;
        if(Lee(m)) return CautareBinara(m+1,d);
        else return CautareBinara(s,m-1);
    }
    return s;
}
void Print()
{
    int i,j;
    for(i=1;i<=n;++i)
    {
        for(j=1;j<=m;++j)
        fout<<a[i][j]<<" ";
        fout<<"\n";
    }
}
int main()
{
    Read();
    Dragon();
    int val=CautareBinara(1,nrmax);
    if(val==1)fout<<"-1";
    else {
           while(Lee(val)==0)--val;
           fout<<val-1;
         }
    return 0;
}