Cod sursa(job #798553)

Utilizator crazzytudTudor Popa crazzytud Data 16 octombrie 2012 19:02:36
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.75 kb
#include<fstream>
#include<iostream>
#include<queue>
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");

struct point{
    int lin,col;
};

queue <point> q;
point start,end;
int n,m;
char v[1005][1005];
int rez[1005][1005];
bool vizitat[1005][1005];
int dlin[]={ 1, 0,  0, -1};
int dcol[]={ 0, 1, -1,  0};

void clear(bool v[1005][1005])
{
    int i,j;
    for(i=0;i<=n+1;i++)
        for(j=0;j<=m+1;j++)
            v[i][j]=false;
}
bool lee2(int limita)
{
    if(rez[start.lin][start.col]<limita)
        return false;
    point x,y;
    q.push(start);
    clear(vizitat);

    vizitat[start.lin][start.col]=true;
    while(!q.empty())
    {
        x=q.front();
        q.pop();
        for(int i=0;i<4;i++)
        {
            y.lin = x.lin + dlin[i];
            y.col = x.col + dcol[i];
            if(rez[y.lin][y.col]!=-1&&rez[y.lin][y.col]>=limita&&vizitat[y.lin][y.col]==false)
            {
                vizitat[y.lin][y.col]=true;
                q.push(y);
            }
        }
    }
    return vizitat[end.lin][end.col];

}
int cautbin()
{
    int pas=1<<12,i;
    for(i=0;pas>0;pas>>=1)
    {
        if(lee2(i+pas))
            i+=pas;
    }
    return i;
}


void lee()
{
    point x,y;
    while(!q.empty())
    {
        x=q.front();
        q.pop();

        for(int i=0;i<4;i++)
        {
            y.lin = x.lin + dlin[i];
            y.col = x.col + dcol[i];
            if(rez[y.lin][y.col]==0&&v[y.lin][y.col]!='D')
            {
                rez[y.lin][y.col] = rez[x.lin][x.col] + 1;
                q.push(y);
            }
        }
    }
}


int main()
{
    int i,j;
    point x;
    in>>n>>m;

    for(i=1;i<=n;i++)
    {
        in.getline(v[i]+1,m+2);
        for(j=1;j<=m;j++)
        {
            if(v[i][j]=='I')
            {
                start.lin=i;
                start.col=j;
            }
            if(v[i][j]=='D')
            {
                x.lin=i;
                x.col=j;
                q.push(x);
            }
            if(v[i][j]=='O')
            {
                end.lin=i;
                end.col=j;
            }
            if(v[i][j]=='*')
            {
                rez[i][j]==-1;
            }
        }
    }

    for(i=0;i<=n+1;i++)
    {
        v[i][0]=v[i][m+1]='*';
        rez[i][0]=rez[i][m+1]=-1;
    }
    for(j=0;j<=m+1;j++)
    {
        rez[0][j]=rez[n+1][j]=-1;
        v[0][j]=v[n+1][j]='*';
    }

    lee();

    /*for(i=0;i<=n+1;i++)
    {
        for(j=0;j<=m+1;j++)
            out<<rez[i][j]<<"\t";
        out<<"\n";
    }*/
    int rezultat=cautbin();
    if(rezultat==0)
       out<<"-1";
    else out<<rezultat;
    return 0;
}