Cod sursa(job #2081051)

Utilizator biaiftimeIftime Bianca biaiftime Data 3 decembrie 2017 20:56:06
Problema Barbar Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 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,nrmin=Nmax*Nmax;
int dx[]={-1,0,1,0};
int dy[]={0,1,0,-1};
int viz[Nmax][Nmax];
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 x,int y)
{
    int i,xv,yv;
    for(i=0;i<4;++i)
    {
        xv=x+dx[i];
        yv=y+dy[i];
        if(a[xv][yv]==0||a[x][y]+1<a[xv][yv]){a[xv][yv]=a[x][y]+1;
                                              Dragon(xv,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; Dragon(i,j+1); }
            nrmax=max(nrmax,a[i][j+1]);
            if(a[i][j+1]!=-1)nrmin=min(a[i][j+1],nrmin);
        }
    }
}
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(viz[xv][yv]==0&&a[xv][yv]>=dist)
            {
                viz[xv][yv]=1;
                c1.push(xv);
                c2.push(yv);
            }
        }
    }
    return viz[xf][yf];
}
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;
}
int main()
{
    Read();
    fout<<CautareBinara(nrmin,nrmax)-1;
    return 0;
}