Cod sursa(job #1032822)

Utilizator Impaler_009Mihai Nitu Impaler_009 Data 16 noiembrie 2013 09:07:22
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <fstream>
#include <cstring>

#define maxn 1010
#define inf 2001

using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");

string a[maxn];
int dir1[4] = {1,-1,0,0},dir2[4] = {0,0,1,-1};
int d[maxn][maxn];
bool viz[maxn][maxn];
int m,n,si,sj,fi,fj,s,l;

struct queue2d
{
    int i,j;
}q[maxn*maxn];

void bfs (bool first, int val)
{
    for (int i=0; i<m; ++i)
    {
        viz[n][i] = 1;
    }

    for (int i=0; i<n; ++i)
    {
        viz[i][m] = 1;
    }

    for (s=1; s<=l; ++s)
    {
        for (int k=0; k<4; ++k)
        {
            int ii = q[s].i + dir1[k], jj = q[s].j + dir2[k];
            if (ii >= 0 && jj >= 0 && !viz[ii][jj] && d[ii][jj] >= val)
            {
                viz[ii][jj] = 1;
                if (first) d[ii][jj] = d[q[s].i][q[s].j] + 1;

                ++l;
                q[l].i = ii;
                q[l].j = jj;
            }
        }
    }
}

bool check (int val)
{
    memset (viz,0,sizeof(viz));

    viz[si][sj] = 1;
    l=1;
    q[1].i = si;
    q[1].j = sj;

    if (d[si][sj] >= val) bfs (0,val);
    else return 0;

    if (viz[fi][fj]) return 1;
    return 0;
}

int main()
{
    fin>>n>>m;

    memset (d,1,sizeof(d));

    for (int i=0; i<n; ++i)
    {
        fin>>a[i];
    }

    for (int i=0; i<n; ++i)
    {
        for (int j=0; j<m; ++j)
        {
            if (a[i][j]=='I')
            {
                si = i;
                sj = j;
            }
            else if (a[i][j]=='O')
            {
                fi = i;
                fj = j;
            }

            if (a[i][j]=='*')
            {
                d[i][j] = -1;
            }
            else if (a[i][j]=='D')
            {
                d[i][j] = 0;

                ++l;
                q[l].i = i;
                q[l].j = j;
                viz[i][j] = 1;
            }
        }
    }

    bfs (1,0);

    int hi = inf, lo = -1;

    while (hi-lo > 1)
    {
        int mid = (lo+hi)/2;

        if (check(mid))
        lo = mid;
        else
        hi = mid;
    }

    fout<<lo;
}