Cod sursa(job #1607482)

Utilizator cristinelulCristian Virga cristinelul Data 21 februarie 2016 11:33:12
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.71 kb
#include <fstream>

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

struct coada
{
    int x,y;
}c[1000*1000+5];
int n,m,xi,yi,u,xf,yf,ma[1003][1003],vx[4]={1,0,-1,0},vy[4]={0,1,0,-1},dmax;
bool viz[1003][1003];
char ch;
void citire()
{
    int i,j;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
        {
            fin>>ch;
            if(ch=='I')
            {
                xi=i;
                yi=j;
            }
            if(ch=='D')
            {
                ma[i][j]=-1;
                u++;
                c[u].x=i;
                c[u].y=j;
            }
            if(ch=='*')
                ma[i][j]=-1;
            if(ch=='O')
            {
                xf=i;
                yf=j;
            }
        }
    for(i=0;i<=n+1;i++)
        ma[i][0]=ma[i][m+1]=-1;
    for(i=0;i<=m+1;i++)
        ma[0][i]=ma[n+1][i]=-1;
}
void lee()
{
    int p=0,i;
    coada aux;
    while(p<u)
    {
        aux=c[++p];
        for(i=0;i<4;i++)
        {
            aux.x=aux.x+vx[i];
            aux.y=aux.y+vy[i];
            if(ma[aux.x][aux.y]!=-1)
                if(ma[aux.x][aux.y]==0 || ma[aux.x][aux.y]>ma[c[p].x][c[p].y]+1)
                {
                    if(ma[c[p].x][c[p].y]==-1)
                        ma[aux.x][aux.y]=1;
                    else
                        ma[aux.x][aux.y]=ma[c[p].x][c[p].y]+1;
                    dmax=max(dmax,ma[aux.x][aux.y]);
                    u++;
                    c[u].x=aux.x;
                    c[u].y=aux.y;
                }
            aux=c[p];
        }
    }
}
int cautare(int x)
{
    int p,u,i;
    p=u=0;
    coada aux;
    if(ma[xi][yi]>=x)
    {
        u++;
        c[u].x=xi;
        c[u].y=yi;
        viz[xi][yi]=1;
    }
    while(p<u)
    {
        aux=c[++p];
        if(aux.x==xf && aux.y==yf)
            return 1;
        for(i=0;i<4;i++)
        {
            aux.x=aux.x+vx[i];
            aux.y=aux.y+vy[i];
            if(ma[aux.x][aux.y]>=x && viz[aux.x][aux.y]==0)
            {
                u++;
                c[u].x=aux.x;
                c[u].y=aux.y;
                viz[aux.x][aux.y]=1;
            }
            aux=c[p];
        }
    }
    return 0;
}
void init()
{
    int i,j;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            viz[i][j]=0;
}
void rezolvare()
{
    int ls,ld,mij;
    ls=1;
    ld=dmax;
    while(ls<=ld)
    {
        mij=(ls+ld)/2;
        if(cautare(mij))
            ls=mij+1;
        else
            ld=mij-1;
        init();
    }
    fout<<ld;
}
int main()
{
    citire();
    lee();
    rezolvare();
    fout.close();
    return 0;
}