Cod sursa(job #1135231)

Utilizator lacraruraduRadu Matei Lacraru lacraruradu Data 7 martie 2014 15:16:47
Problema Barbar Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <fstream>
#include <queue>
using namespace std;

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

struct pozitie
{
    int lin,col;
};

char s[1002][1002];
int d[1002][1002];
bool fv[1002][1002];
int calc[1002][1002][4];


queue <pozitie> q;

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

int lungime(pozitie x, int id)
{
    if(calc[x.lin][x.col][id])
        return calc[x.lin][x.col][id];

    int i,maxim;
    pozitie y;
    fv[x.lin][x.col] = 1;
    maxim = 0;

    for(i = 0; i < 4; i++)
    {
        y.lin = x.lin + dlin[i];
        y.col = x.col + dcol[i];

        if(s[y.lin][y.col] != NULL && !fv[y.lin][y.col] && s[y.lin][y.col] != 'I')
        {
            maxim = max(maxim, lungime(y, i));
        }
        else if(s[y.lin][y.col] == 'I')
        {
            maxim = d[y.lin][y.col];
            break;
        }
    }
    maxim = min(maxim, d[x.lin][x.col]);
    calc[x.lin][x.col][id] = maxim;
    fv[x.lin][x.col] = 0;
    return maxim;
}

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

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

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

    while(!q.empty())
    {
        x = q.front();
        q.pop();

        for(i = 0; i < 4; i++)
        {
            y.lin = x.lin + dlin[i];
            y.col = x.col + dcol[i];
            if(s[y.lin][y.col] != NULL && !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(d[i][j] == 1 || s[i][j] == '*')
            {
                d[i][j] = -1;
                fv[i][j] = 1;
            }
            else
                d[i][j]--;
        }

    for(i = 0; i < 4; i++)
        calc[i1][j1][i] = d[i1][j1];

    out<<lungime((pozitie){i2, j2},0);
    return 0;
}