Cod sursa(job #560484)

Utilizator acelasi7Tudor Maxim acelasi7 Data 18 martie 2011 15:26:03
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<cstdio>
#include<fstream>
#include<cstring>
#include<queue>
using namespace std;
#define nrn 1001

struct punct{int x,y;} I,O;
int A[nrn][nrn];
bool viz[nrn][nrn];
queue<punct>Q;
int R,L;

FILE *out=fopen("barbar.out","w");

int const dx[]={-1,0,1,0};
int const dy[]={0,1,0,-1};
int drum(int val)
{
    int i;
    punct p,aux;
    for(i=1;i<=R;++i)
        memset(viz[i],0,sizeof(viz[i]));
    Q.push(I);
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        viz[p.x][p.y]=1;
        if(p.x==O.x&&p.y==O.y)
        {
            while(!Q.empty())
                Q.pop();
            return 1;
        }
        for(i=0;i<4;++i)
        {
            if(A[p.x+dx[i]][p.y+dy[i]]>=val&&!viz[p.x+dx[i]][p.y+dy[i]])
            {
                aux.x=p.x+dx[i];
                aux.y=p.y+dy[i];
                viz[aux.x][aux.y]=true;
                Q.push(aux);
            }
        }
    }
    return 0;
}
int main()
{
    int i,j;
    punct p,aux;
    char c;
    ifstream in("barbar.in");
    in>>R>>L;
    for(i=1;i<=R;++i)
    for(j=1;j<=L;++j)
    {
        in>>c;
        switch(c)
        {
            case('*'):A[i][j]=-1;break;
            case('D'):A[i][j]=1,p.x=i,p.y=j,Q.push(p);break;
            case('I'):I.x=i,I.y=j;break;
            case('O'):O.x=i,O.y=j;break;
        }
    }
    for(i=0;i<=R+1;++i)
        A[i][0]=A[i][L+1]=-1;
    for(j=1;j<=L;++j)
        A[0][j]=A[R+1][j]=-1;
    while(!Q.empty())
    {
        p=Q.front();
        Q.pop();
        for(i=0;i<4;++i)
        {
            if(A[p.x+dx[i]][p.y+dy[i]]>=0)
            {
                if(A[p.x+dx[i]][p.y+dy[i]]!=0&&A[p.x+dx[i]][p.y+dy[i]]<A[p.x][p.y]+1) continue;
                A[p.x+dx[i]][p.y+dy[i]]=A[p.x][p.y]+1;
                aux.x=p.x+dx[i];
                aux.y=p.y+dy[i];
                Q.push(aux);
            }
        }
    }
    int lf,rt,mid,sol=-2;;
    lf=1;rt=R+L+1;
    while(lf<=rt)
    {
        mid=(lf+rt)/2;
        if(drum(mid))
        {
            sol=mid;
            lf=mid+1;
        }
        else rt=mid-1;
    }
    --sol;
    fprintf(out,"%d\n",sol);
    return 0;
}