Cod sursa(job #1132130)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 2 martie 2014 18:44:47
Problema Barbar Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.23 kb
#include <fstream>
#include <queue>

using namespace std;

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

struct pozitie
{
    int lin,col;
};

char v[1001][1001];
int d[1001][1001];
int d1[1001][1001];
bool fv[1001][1001];
queue <pozitie> q;

const int dlin[] = {-1,0,1,0};
const int dcol[] = {0,1,0,-1};

int barbar(pozitie x)
{
    if(d1[x.lin][x.col])
        return d1[x.lin][x.col];
    fv[x.lin][x.col] = 1;
    int i,rc = 0;
    pozitie y;
    for(i = 0; i < 4; i++)
    {
        y.lin = x.lin + dlin[i];
        y.col = x.col + dcol[i];
        if(!fv[y.lin][y.col] && d[y.lin][y.col] != -1)
            rc = max(rc, barbar(y));
    }
    rc = min(rc, d[x.lin][x.col]);
    d1[x.lin][x.col] = rc;
    fv[x.lin][x.col] = 0;
    return rc;
}

int main()
{
    int m,n,i,j,i1,j1,i2,j2;
    in>>m>>n;

    for(i = 1; i <= m; i++)
        in>>(1 + v[i]);

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

    for(j = 0; j <= n + 1; j++)
    {
        d[0][j] = -1;
        d[m + 1][j] = -1;
    }

    for(i = 1; i <= m; i++)
        for(j = 1; j <= n; j++)
            if(v[i][j] == 'D')
            {
                d[i][j] = 1;
                q.push((pozitie){i,j});
            }
            else if(v[i][j] == 'I')
            {
                i1 = i;
                j1 = j;
            }
            else if(v[i][j] == 'O')
            {
                i2 = i;
                j2 = j;
            }

    pozitie x;
    while(!q.empty())
    {
        x = q.front();
        q.pop();
        pozitie y;
        for(i = 0; i < 4; i++)
        {
            y.lin = x.lin + dlin[i];
            y.col = x.col + dcol[i];
            if(!d[y.lin][y.col])
            {
                d[y.lin][y.col] = 1 + d[x.lin][x.col];
                q.push(y);
            }
        }
    }

    for(i = 1; i <= m; i++)
        for(j = 1; j <= n; j++)
            if(v[i][j] == '*')
                d[i][j] = -1;
    for(i = 1; i <= m; i++)
    {
        for(j = 1; j <= n; j++)
            out<<d[i][j]<<'\t';
        out<<'\n';
    }

    d1[i1][j1] = d[i1][j1];
    out<<barbar((pozitie){i2,j2});
    return 0;
}