Cod sursa(job #1586463)

Utilizator stanciuandreiStanciulescu Andrei stanciuandrei Data 1 februarie 2016 11:11:20
Problema Barbar Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <iostream>
#include <fstream>
#define NMAX 1002
using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
char mp[NMAX][NMAX];
bool filler[NMAX][NMAX];
void fill(int lin, int col,int mval)
{
    filler[lin][col]=1;
    if(!filler[lin+1][col]&&mp[lin+1][col]>=mval)
        fill(lin+1, col, mval);
    if(!filler[lin-1][col]&&mp[lin-1][col]>=mval)
        fill(lin-1, col, mval);
    if(!filler[lin][col+1]&&mp[lin][col+1]>=mval)
        fill(lin, col+1, mval);
    if(!filler[lin][col-1]&&mp[lin][col-1]>=mval)
        fill(lin, col-1, mval);
}
struct element
{
    int x, y;
};
int n, m, nd, bl, bc, il, ic, p, u;
element dragon[NMAX*NMAX];
element que[NMAX*NMAX];
int dx[]= {-1, 0, 1, 0};
int dy[]= {0, 1, 0, -1};
bool mrg(int a)
{
    for(int i=0; i<=n; i++)
        for(int j=0; j<=m; j++)
            filler[i][j]=0;
    fill(bl, bc, a);
    return filler[il][ic];
}
void border()
{
    for(int i=0; i<=n+1; i++)
    {
        mp[i][0]=-1, mp[i][m+1]=-1;
    }
    for(int i=0; i<=m+1; i++)
    {
        mp[0][i]=-1, mp[n+1][i]=-1;
    }
}
int main()
{
    in>>n>>m;
    p=0;
    u=-1;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            in>>mp[i][j];
            if(mp[i][j]=='I')
                bl=i, bc=j, mp[i][j]=0;
            else if(mp[i][j]=='D')
                dragon[nd].x=i, dragon[nd].y=j, nd++, mp[i][j]=1;
            else if(mp[i][j]=='*')
                mp[i][j]=-1;
            else if(mp[i][j]=='O')
                il=i, ic=j, mp[i][j]=0;
            else
                mp[i][j]=0;
        }
    }
    for(int i=0; i<nd; i++)
    {
        u++;
        que[u]=dragon[i];
    }
    border();
    while(p<=u)
    {
        int x=que[p].x;
        int y=que[p].y;
        p++;
        for(int i=0; i<4; i++)
        {
            if(mp[x+dx[i]][y+dy[i]]==0)
            {
                mp[x+dx[i]][y+dy[i]]=mp[x][y]+1;
                u++;
                que[u]=(element)
                {
                    x+dx[i], y+dy[i]
                };
            }
        }
    }
    int pas=1<<10, cp=0;
    while(pas)
    {
        if(mrg(cp+pas))
            cp+=pas;
        pas>>=1;
    }
    if(cp==1)
        out<<-1;
    else if(cp==2)
        out<<0;
    else
        out<<cp-1;
    return 0;
}