Cod sursa(job #1846189)

Utilizator ASD135Radu M ASD135 Data 12 ianuarie 2017 12:27:01
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.56 kb
#include<cstdio>
#include<queue>
 
FILE* in=fopen("barbar.in","r");
FILE* out=fopen("barbar.out","w");
 
const int Q=1007;
 
int l,c;
 
bool d[Q][Q];
 
struct point{
    int a,b;
};
 
std::queue<point> q;
 
const int dx[]={0,1,0,-1,0};
const int dy[]={0,0,1,0,-1};
 
int sx,sy,fx,fy;
 
int v[Q][Q];
 
int viz[Q][Q];
 
bool ver(int x)
{
    while(!q.empty())
        q.pop();
 
    q.push(point{sx,sy});
 
    if(v[sx][sy]<x)
        return 0;
 
    point act;
 
    while(!q.empty())
    {
        act=q.front();
 
 
        q.pop();
 
        for(int j=1; j<=4; j++)
        {
            if(d[act.a+dx[j]][act.b+dy[j]]!=1 && v[act.a+dx[j]][act.b+dy[j]]>=x && viz[act.a+dx[j]][act.b+dy[j]]!=x)
            {
                if(act.a+dx[j]==fx && act.b+dy[j]==fy)
                {
                    return 1;
                }
 
                viz[act.a+dx[j]][act.b+dy[j]]=x;
                q.push(point{act.a+dx[j],act.b+dy[j]});
            }
        }
 
    }
 
    return 0;
}
 
char g[Q][Q];
 
void make()
{
    int nr;
    int pas=0;
 
    point act;
 
    while(!q.empty())
    {
        nr=q.size();
        pas++;
 
        for(int i=1; i<=nr; i++)
        {
            act=q.front();
            q.pop();
 
            for(int j=1; j<=4; j++)
            {
                if(d[act.a+dx[j]][act.b+dy[j]]!=1 && v[act.a+dx[j]][act.b+dy[j]]==0)
                {
                    v[act.a+dx[j]][act.b+dy[j]]=pas+1;
                    q.push(point{act.a+dx[j],act.b+dy[j]});
                }
            }
 
        }
    }
}
 
int main()
{
    fscanf(in,"%d %d\n",&l,&c);
 
    char h;
 
    for(int i=1; i<=l; i++)
    {
        d[i][0]=1;
        d[i][c+1]=1;
    }
 
    for(int j=1; j<=c; j++)
    {
        d[0][j]=1;
        d[l+1][j]=1;
    }
 
    for(int i=1; i<=l; i++)
        fgets(g[i]+1,Q,in);
 
    for(int i=1; i<=l; i++)
    {
        for(int j=1; j<=c; j++)
        {
            h=g[i][j];
 
            if(h=='*')
                d[i][j]=1;
            if(h=='D')
            {
                q.push(point{i,j});
                v[i][j]=1;
            }
            if(h=='I')
            {
                sx=i;
                sy=j;
            }
            if(h=='O')
            {
                fx=i;
                fy=j;
            }
        }
        fscanf(in,"\n");
    }
 
    make();
 
    int p=1024;
 
    int k=0;
 
    bool minus=0;
 
    while(p)
    {
        if(ver(p+k)==1)
        {
            k+=p;
            minus=1;
        }
        p/=2;
    }
 
    if(!minus)
        fprintf(out,"-1");
    else
        fprintf(out,"%d",k-1);
 
    return 0;
}