Cod sursa(job #1686026)

Utilizator raulrusu99Raul Rusu raulrusu99 Data 11 aprilie 2016 23:49:46
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.58 kb
#include <iostream>
#include <fstream>
#include <queue>
#define DM 1001
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
queue <int> qx,qy;
const int dx[]={-1,0,1,0}, dy[]={0,1,0,-1};
int n,m,mat[DM][DM],xi,yi,xs,ys,maxx,le[DM][DM];
char v[DM],a[DM][DM];
void pfill()
{
    while(qx.size())
    {
        int x=qx.front();
        int y=qy.front();
        qx.pop();
        qy.pop();
        for(int k=0;k<=3;k++)
        {
            int xx=x+dx[k];
            int yy=y+dy[k];
            if(xx && yy && xx<=n && yy<=m && mat[xx][yy]==0)
            {
                mat[xx][yy]=mat[x][y]+1;
                maxx=max(maxx,mat[xx][yy]);
                qx.push(xx);
                qy.push(yy);
            }
        }
    }
}
void goleste()
{
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            le[i][j]=0;
}
bool verif(int res)
{
    le[xi][yi]=1;
    qx.push(xi);
    qy.push(yi);
    while(qx.size())
    {
        int x=qx.front();
        int y=qy.front();
        qx.pop();
        qy.pop();
        for(int k=0;k<=3;k++)
        {
            int xx=x+dx[k];
            int yy=y+dy[k];
            if(xx && yy && xx<=n && yy<=m && mat[xx][yy]>=res && mat[xx][yy]>1 && le[xx][yy]==0)
            {
                le[xx][yy]=1;
                qx.push(xx);
                qy.push(yy);
            }
        }
    }
    if(le[xs][ys]==1) return 1;
    else return 0;
}
int caut_bin()
{
    int lo=1,hi=maxx,mi;
    while(lo<=hi)
    {
        mi=(lo+hi)/2;
        if(verif(mi)==0) hi=mi-1;
        else lo=mi+1;
        goleste();
    }
    return hi;
}
int main()
{
    f>>n>>m; f.get();
    for(int i=1;i<=n;i++)
    {
        f.getline(a[i]+1,m+2);
        for(int j=1;j<=m;j++)
        {
            if(a[i][j]=='I')
            {
                xi=i;
                yi=j;
            }
            if(a[i][j]=='O')
            {
                xs=i;
                ys=j;
            }
            if(a[i][j]=='D')
            {
                qx.push(i);
                qy.push(j);
                mat[i][j]=1;
            }
            if(a[i][j]=='*')
                mat[i][j]=-1;
        }
    }

    pfill();
  /*  for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            cout<<mat[i][j]<<" ";
        cout<<"\n";
    }
    cout<<"\n";
    cout<<verif(8)<<"\n";
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            cout<<le[i][j]<<" ";
        cout<<"\n";
    }*/
    goleste();
    g<<caut_bin()-1;
    return 0;
}