Cod sursa(job #1998606)

Utilizator victoreVictor Popa victore Data 8 iulie 2017 15:14:02
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.6 kb
#include<cstdio>
#include<queue>
#include<cstring>
#include<stack>
#include<cstring>

using namespace std;

const int nmax=1005;
const int inf=1e9;

inline int min(int a,int b)
{
    if(a>b)
        return b;
    return a;
}

typedef pair<int,int> ii;

stack<ii> dragoni;
char g[nmax][nmax];
char ch;
int ddrag[nmax][nmax],ax[]={0,1,0,-1},ay[]={-1,0,1,0},r,c;
int tempdist[nmax][nmax];
ii start,finish;

inline bool bfs(int nr)
{
    queue<ii> q;
    int i,j;
    q.push(start);
    for(i=1;i<=r;i++)
        for(j=1;j<=c;++j)
            tempdist[i][j]=-1;
    tempdist[start.first][start.second]=0;
    int x,y,newx,newy;
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(i=0;i<4;++i)
        {
            newx=x+ax[i];
            newy=y+ay[i];
            ch=g[newx][newy];
            if(tempdist[newx][newy]==-1 && (ch=='.' || ch=='O') && ddrag[newx][newy]>=nr)
            {
                if(ch=='O')
                    return 1;
                q.push(ii(newx,newy));
                tempdist[newx][newy]=tempdist[x][y]+1;
            }
        }
    }
    return 0;
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j;
    scanf("%d%d\n",&r,&c);
    for(i=1;i<=r;++i)
    {
        for(j=1;j<=c;++j)
        {
            scanf("%c",&ch);
            g[i][j]=ch;
            if(g[i][j]=='D')
                dragoni.push(ii(i,j));
            else if(g[i][j]=='I')
                start=ii(i,j);
            else if(g[i][j]=='O')
                finish=ii(i,j);
        }
        getchar();
    }
    for(i=1;i<=r;++i)
        for(j=1;j<=c;++j)
            ddrag[i][j]=inf;
    queue<ii> q;
    while(!dragoni.empty())
    {
        q.push(dragoni.top());
        ddrag[dragoni.top().first][dragoni.top().second]=0;
        dragoni.pop();
    }
    int x,y,newx,newy;
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(i=0;i<4;++i)
        {
            newx=x+ax[i];
            newy=y+ay[i];
            if(ddrag[newx][newy]>ddrag[x][y]+1)
            {
                ddrag[newx][newy]=ddrag[x][y]+1;
                q.push(ii(newx,newy));
            }
        }
    }
    int st,dr;
    st=0;
    dr=2010;
    int med,ans=0;
    while(st<=dr)
    {
        med=((dr-st)>>1)+st;
        if(bfs(med))
            ans=med,st=med+1;
        else
            dr=med-1;
    }
    if(ans==0)
        printf("-1");
    else
        printf("%d",ans);
}