Cod sursa(job #1841002)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 5 ianuarie 2017 03:14:09
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <cstdio>
#include <queue>

using namespace std;

struct punct
{
    int x,y;
};

queue<punct> q;
int n,m,i1,j1,dist[1010][1010],c;
char v[1010][1010],vaz[1010][1010];
punct v1[5];

int bfs(int l)
{
    int p=0;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            vaz[i][j]=0;
    queue<punct> q1;
    q1.push({i1,j1});
    vaz[i1][j1]=1;
    if(dist[i1][j1]>=l)
    while(!q1.empty())
    {
        int x=q1.front().x,y=q1.front().y;
        q1.pop();
        for(int i=0;i<4;i++)
        {
            int a=x+v1[i].x,b=y+v1[i].y;
            if(vaz[a][b]==0 && dist[a][b]>=l && (v[a][b]=='.' or v[a][b]=='O'))
            {
                vaz[a][b]=1;
                if(v[a][b]=='O') {p=1;break;}
                q1.push({a,b});
            }
        }
        if(p==1) break;
    }
    if(p==1) c=1;
    return p;
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    v1[0].x=-1;v1[1].y=1;v1[2].x=1;v1[3].y=-1;
    for(int i=1;i<=n;i++)
        gets(v[i]+1);
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            if(v[i][j]=='I') {i1=i;j1=j;}
            else if(v[i][j]=='D') q.push({i,j});
    for(int i=0;i<=n+1;i++)
        dist[i][0]=dist[i][m+1]=-1;
    for(int i=0;i<=m+1;i++)
        dist[0][i]=dist[n+1][i]=-1;
    while(!q.empty())
    {
        int x=q.front().x,y=q.front().y;
        q.pop();
        for(int i=0;i<4;i++)
        {
            int a=x+v1[i].x,b=y+v1[i].y;
            if((v[a][b]=='.' or v[a][b]=='I' or v[a][b]=='O') && dist[a][b]==0)
            {
                dist[a][b]=dist[x][y]+1;
                q.push({a,b});
            }
        }
    }
    for(int i=0;i<=n+1;i++)
        vaz[i][0]=vaz[i][m+1]=-1;
    for(int i=0;i<=m+1;i++)
        vaz[0][i]=vaz[n+1][i]=-1;
    int st=1,dr=1000;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        if(bfs(mid)==1) st=mid+1;
        else dr=mid-1;
    }
    if(c==0) printf("-1");
    else
    printf("%d",dr);
    return 0;
}