Cod sursa(job #1930120)

Utilizator iulianrotaruRotaru Gheorghe-Iulian iulianrotaru Data 18 martie 2017 15:32:02
Problema Barbar Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.22 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("barbar.in");
ofstream g("barbar.out");
int n,m,i,j,nr,q,w,step,x,y,X,Y,D[1<<10][1<<10],viz[1<<10][1<<10];
int dx[]={-1,1,0,0};
int dy[]={0,0,-1,1};
char M[1<<10][1<<10];
queue <pair <int,int> > Q;
bool inside(int x,int y)
{
    return (x&&y&&x<=n&&y<=m);
}
bool check(int dist)
{
    ++nr;
    if(D[x][y]>=dist) Q.push(make_pair(x,y));
    while(!Q.empty())
    {
        q=Q.front().first;
        w=Q.front().second;
        Q.pop();
        if(viz[q][w]==nr) continue;
        viz[q][w]=nr;
        for(i=0;i<4;++i)
           if(inside(q+dx[i],w+dy[i]))
                if(M[q+dx[i]][w+dy[i]]!='*'&&D[q+dx[i]][w+dy[i]]>=dist)
                    Q.push(make_pair(q+dx[i],w+dy[i]));
    }
    return (viz[X][Y]==nr);
}
int main()
{
    f>>n>>m;
    for(i=1;i<=n;++i)
        for(j=1;j<=m;++j) D[i][j]=1<<30;
    for(i=1;i<=n;++i)
    {
        f>>(M[i]+1);
        for(j=1;j<=m;++j)
        {
            if(M[i][j]=='I') x=i,y=j;
            if(M[i][j]=='O') X=i,Y=j;
            if(M[i][j]=='D')
            {
                Q.push(make_pair(i,j));
                D[i][j]=0;
            }
        }
    }
    ++nr;
    while(!Q.empty())
    {
        q=Q.front().first;
        w=Q.front().second;
        Q.pop();
        if(viz[q][w]==nr) continue;
        viz[q][w]=nr;
        for(i=0;i<4;++i)
           if(inside(q+dx[i],w+dy[i]))
                if(M[q+dx[i]][w+dy[i]]!='*'&&D[q+dx[i]][w+dy[i]]>D[q][w]+1)
        {
            D[q+dx[i]][w+dy[i]]=D[q][w]+1;
            Q.push(make_pair(q+dx[i],w+dy[i]));
        }
    }
    ++nr;
    Q.push(make_pair(x,y));
    while(!Q.empty())
    {
        q=Q.front().first;
        w=Q.front().second;
        Q.pop();
        if(viz[q][w]==nr) continue;
        viz[q][w]=nr;
        for(i=0;i<4;++i)
           if(inside(q+dx[i],w+dy[i]))
                if(M[q+dx[i]][w+dy[i]]!='*')
                    Q.push(make_pair(q+dx[i],w+dy[i]));
    }
    if(viz[X][Y]!=nr)
    {
        g<<-1;
        return 0;
    }
    int sol=0;
    for(step=1<<9;step;step>>=1)
        if(sol+step<=min(n,m))
            if(check(sol+step)) sol+=step;
    g<<sol;
    return 0;
}