Cod sursa(job #1523373)

Utilizator refugiatBoni Daniel Stefan refugiat Data 12 noiembrie 2015 17:49:45
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.41 kb
#include<iostream>
#include<fstream>
#include<queue>
#include<bitset>
#define mkp make_pair
using namespace std;
ifstream si("barbar.in");
ofstream so("barbar.out");
//FILE*so=fopen("balulbobocilor.out","w");
const int NMAX=1005;
const int D=0,L=-1,P=-2;
int n,m;
bitset<NMAX> viz[NMAX];
queue< pair<int,int> > q;
int dist[NMAX][NMAX];
int dr;
int s[]={1,0,-1,0};
int j[]={0,1,0,-1};
void crearedist()
{
    int x,y;
    int i;
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(i=0;i<4;++i)
        {
            if(dist[x+s[i]][y+j[i]]==-1)
            {
                dist[x+s[i]][y+j[i]]=dist[x][y]+1;
                dr=dist[x+s[i]][y+j[i]];
                q.push( mkp(x+s[i],y+j[i]) );
            }
        }
    }
}
int sx,sy,fx,fy;
bool pos(int dmin)
{
    queue< pair<int,int> > cord;
    cord.push( mkp(sx,sy) );
    int x,y,i;
    viz[sx][sy]=1;
    while(!cord.empty())
    {
        x=cord.front().first;
        y=cord.front().second;
        cord.pop();
        if(x==fx&&y==fy)
            return true;
        for(i=0;i<4;++i)
        {
            if(dist[x+s[i]][y+j[i]]>=dmin&&viz[x+s[i]][y+j[i]]==0)
            {
                viz[x+s[i]][y+j[i]]=1;
                cord.push( mkp(x+s[i],y+j[i]) );
            }
        }
    }
    return false;
}
int rez()
{
    int i;
    int sol=-1,st=0,mij;

    while(st<=dr)
    {
        for(i=1;i<n;++i)
            viz[i].reset();
        mij=(st+dr)>>1;
        //cout<<mij<<'\n';
        if(pos(mij))
        {
            st=mij+1;
            sol=mij;
        }
        else
            dr=mij-1;
    }
    return sol;
}
int main()
{
    si>>n>>m;
    ++n;
    ++m;
    int i,j;
    char a;
    for(i=1;i<n;++i)
    {
        for(j=1;j<m;++j)
        {
            si>>a;
            switch(a)
            {
                case '.': dist[i][j]=L; break;
                case '*': dist[i][j]=P; break;
                case 'D': dist[i][j]=D; q.push(mkp(i,j)); break;
                case 'I': sx=i; sy=j; dist[i][j]=L; break;
                case 'O': fx=i; fy=j; dist[i][j]=L; break;
            }
        }
        dist[i][0]=P;
        dist[i][m]=P;
    }
    for(j=0;j<=m;++j)
    {
        dist[0][j]=P;
        dist[n][j]=P;
    }
    crearedist();
    //cout<<pos(2);
    so<<rez()<<'\n';
    so.close();

}