Cod sursa(job #1027721)

Utilizator andreivFMI - vacaroiu andrei andreiv Data 12 noiembrie 2013 22:58:49
Problema Barbar Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.39 kb
#include <cstdio>
#include <vector>
using namespace std;

int N, M;
int map[1009][1009];
vector <pair<int, int> > coad[2009]; // pun in coada casutele la distanta x de cel mai apropiat dragon prin care pot sa trec
int dx[] = {0, 1, 0, -1}, dy[] = {1, 0, -1, 0};

void fill(int x, int y)
{
    int val = map[x][y] + 1;
    for (int i = 0; i < 4; ++i)
        if (x + dx[i] > 0 && x + dx[i] <= N && y + dy[i] > 0 && y + dy[i] <=M)
            if (map[x + dx[i]][y + dy[i]] > val || map[x + dx[i]][y + dy[i]] == 0)
            map[x + dx[i]][y + dy[i]] = val, fill(x + dx[i], y + dy[i]);

}

int main()
{
    int xx, xy, yx, yy;

    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    scanf("%d %d\n", &N, &M);
    for (int i = 1; i <= N; ++i)
    {
        char S[1009];
        scanf("%s", &S);
        for (int j = 0; j < M; ++j)
            if (S[j] == '*')
                map[i][j + 1] = -1;
            else
                if (S[j] == 'D')
                    map[i][j + 1] = 1;
                else
                    if (S[j] == 'I')
                        xx = i, xy = j + 1;
                    else
                        if (S[j] == 'O')
                            yx = i, yy = j + 1;
    }

    for (int i = 1; i <= N; ++i)
        for (int j = 1; j <= M; ++j)
            if (map[i][j] == 1)
                fill(i,j);

//    for (int i = 1; i<= N; ++i)
//    {
//        for (int j = 1 ; j <= M; ++j)
//            printf("%d ", map[i][j]);
//        printf("\n");
//    }

    coad[map[xx][xy]].push_back(make_pair(xx,xy));
    for (int i = map[xx][xy]; i > 1; --i)
    {
        while (!coad[i].empty())
        {
            int x = coad[i].back().first, y = coad[i].back().second;
            coad[i].pop_back();
            for (int j = 0; j < 4; ++j)
                if (x + dx[j] > 0 && x + dx[j] <= N && y + dy[j] > 0 && y + dy[j] <=M && map[x + dx[j]][y + dy[j]] > 1)
                {
                    if (map[x + dx[j]][y + dy[j]] >= i)
                        coad[i].push_back(make_pair(x + dx[j], y + dy[j])), map[x + dx[j]][y + dy[j]] = 0;
                    else
                        coad[map[x + dx[j]][y + dy[j]]].push_back(make_pair(x + dx[j], y + dy[j])), map[x + dx[j]][y + dy[j]] = 1;
                }
        }

        if (map[yx][yy] <= 1)
        {
            printf("%d\n", i - 1 - map[yx][yy]);
            return 0;
        }

    }
printf("0\n");
return 0;
}