Cod sursa(job #792090)

Utilizator lily3Moldovan Liliana lily3 Data 26 septembrie 2012 13:48:58
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.16 kb
#include<fstream>
#include<queue>
#define inf 100000000
using namespace std;
 ofstream g("barbar.out");

int i,j,n,m,a[1002][1002],d[1002][1002],b[1002][1002];
int xi,yi,xf,yf,rez=0,st,dr,mij;
struct nr
{
    int x,y;
};
queue<nr> q;
char x;
int dx[]={-1,0,1,-0},dy[]={0,1,0,-1};
int verif(int x,int y)
{
    return (x>0&&y>0&&x<=n&&y<=m);
}
void lee()
{
    int k,xx,yy,ox,oy;
    while(!q.empty())
    {
        xx=q.front().x;
        yy=q.front().y;
       for(k=0;k<4;++k)
       {
           ox=xx+dx[k];
           oy=yy+dy[k];
           if(a[xx][yy]+1<a[ox][oy]&&verif(ox,oy))
           {
               a[ox][oy]=a[xx][yy]+1;
               q.push((nr) {ox,oy});
           }
       }
       q.pop();
    }
}
int lee1(int val)
{
    int k,xx,yy,ox,oy;
    q.push((nr) {xi,yi});
    while(!q.empty())
    {
        xx=q.front().x;
        yy=q.front().y;
        for(k=0;k<4;++k)
        {
            ox=xx+dx[k];
            oy=yy+dy[k];
            if(a[ox][oy]>=val&&d[ox][oy]!=val&&a[ox][oy]!=-1&&verif(ox,oy))
            {
                d[ox][oy]=val;
                q.push((nr) {ox,oy});
                if(ox==xf&&oy==yf)
                {
                while(!q.empty())
                q.pop();
                return 1;
                }

            }

        }
        q.pop();
    }
    return 0;
}
int main()
{
    ifstream f("barbar.in");

    f>>n>>m;
    for(i=1;i<=n;++i)
       for(j=1;j<=m;++j)
       {
           f>>x;
           if(x=='D')
           q.push((nr) {i,j}),a[i][j]=0;
           if(x=='*')
           a[i][j]=-1;
           if(x=='.')
           a[i][j]=inf;
           if(x=='I')
           xi=i,yi=j,d[i][j]=a[i][j]=inf;
           if(x=='O')
           xf=i,yf=j,d[i][j]=a[i][j]=inf;
       }
       lee();
       st=1,dr=min(a[xi][yi],a[xf][yf]);
       while(st<=dr)
       {
           mij=(st+dr)/2;
           if(lee1(mij))
           {
               st=mij+1;
               if(rez<=mij)
               rez=mij;
           }
           else
           dr=mij-1;
       }
       if(rez)
       g<<rez;
       else
       g<<-1;
    return 0;
}