Cod sursa(job #1640951)

Utilizator vazanIonescu Victor Razvan vazan Data 8 martie 2016 20:05:23
Problema Barbar Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.6 kb
#include<cstdio>
#include<queue>
using namespace std;
#define INF 10000000
#define MAX 1000
struct COORD
{
    int x, y, dep;
};
inline COORD mk(int x, int y, int dep)
{
    COORD ret;
    ret.x=x;
    ret.y=y;
    ret.dep=dep;
    return ret;
}
int pozx[MAX+10], pozy[MAX+10];
int maped[MAX+10][MAX+10], parc[MAX+10][MAX+10];
int dx[4]={1, 0, -1, 0};
int dy[4]={0, -1, 0, 1};
int main()
{
    freopen("barbar.in", "r", stdin);
    freopen("barbar.out", "w", stdout);
    int n, m, i, j;
    int stx, sty, obx, oby;
    int cr=0;
    char s[MAX+10];
    scanf("%d%d", &n, &m);
    gets(s);
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            maped[i][j]=INF;
            parc[i][j]=INF;
        }
    for(i=1; i<=n; i++)
    {
        gets(s);
        for(j=0; j<m; j++)
        {
            if(s[j]=='*')
                maped[i][j+1]=-1;
            if(s[j]=='D')
            {
                cr++;
                pozx[cr]=i;
                pozy[cr]=j+1;
            }
            if(s[j]=='I')
            {
                stx=i;
                sty=j+1;
            }
            if(s[j]=='O')
            {
                obx=i;
                oby=j+1;
            }
        }
    }
    queue<COORD> drag;
    for(i=1; i<=cr; i++)
    {
        drag.push(mk(pozx[i], pozy[i], 1));
        maped[pozx[i]][pozy[i]]=1;
    }
    int x, y, dep, nextx, nexty;
    while(!drag.empty())
    {
        x=drag.front().x;
        y=drag.front().y;
        dep=drag.front().dep+1;
        for(i=0; i<4; i++)
        {
            nextx=x+dx[i];
            nexty=y+dy[i];
            if(maped[nextx][nexty]!=-1 && dep<maped[nextx][nexty])
            {
                maped[nextx][nexty]=dep;
                drag.push(mk(nextx, nexty, dep));
            }
        }
        drag.pop();
    }
    int maxim=-1;
    for(i=1; i<=n; i++)
        for(j=1; j<=m; j++)
        {
            if(maped[i][j]==INF)
                maped[i][j]=0;
            else
                maped[i][j]--;
            if(maped[i][j]>maxim)
                maxim=maped[i][j];
        }
//    for(i=1; i<=n; i++)
//    {
//        for(j=1; j<=m; j++)
//        {
//            if(maped[i][j]<0)
//                printf("x ");
//            else
//                printf("%d ", maped[i][j]);
//        }
//        printf("\n");
//    }
//    printf("\n");
    drag.push(mk(stx, sty, maped[stx][sty]));
    parc[stx][sty]=maped[stx][sty];
    queue<COORD> drag2;
    while(!drag.empty())
    {
        x=drag.front().x;
        y=drag.front().y;
        dep=drag.front().dep;
        parc[x][y]=dep;
        for(i=0; i<4; i++)
        {
            nextx=x+dx[i];
            nexty=y+dy[i];
            if(maped[nextx][nexty]>=dep && parc[nextx][nexty]==INF)
            {
                drag.push(mk(nextx, nexty, dep));
                parc[nextx][nexty]=dep;
            }
            else if(maped[nextx][nexty]==dep-1)
                drag2.push(mk(nextx, nexty, dep-1));
        }
        drag.pop();
        if(drag.empty())
            while(!drag2.empty())
            {
                drag.push(drag2.front());
                drag2.pop();
            }
    }
//    for(i=1; i<=n; i++)
//    {
//        for(j=1; j<=m; j++)
//        {
//            if(parc[i][j]==INF)
//                printf("x ");
//            else
//                printf("%d ", parc[i][j]);
//        }
//        printf("\n");
//    }
    if(parc[obx][oby]==INF)
        printf("-1");
    else
        printf("%d", parc[obx][oby]);
    return 0;
}