Cod sursa(job #1637426)

Utilizator delia_99Delia Draghici delia_99 Data 7 martie 2016 17:13:28
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.42 kb
#include <cstdio>
#include <queue>
#include <algorithm>
#define NMAX 1000
#define inf 1000005
using namespace std;

int n,m,i,j,l1,c1,l2,c2,daenerys[NMAX+5][NMAX+5],D[NMAX+5][NMAX+5];
char s[NMAX+5];
const int dx[4]= {0,0,1,-1};
const int dy[4]= {1,-1,0,0};
queue <pair <int,int> >q;

void lee1(int M[NMAX+5][NMAX+5])
{
    int x,y,xx,yy;
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(int k=0; k<4; ++k)
        {
            xx=x+dx[k];
            yy=y+dy[k];
            if(xx>0 && yy>0 && xx<=n && yy<=m)
                if(M[xx][yy]!=-1 && M[x][y]+1<M[xx][yy])
                {
                    M[xx][yy]=M[x][y]+1;
                    q.push(make_pair(xx,yy));
                }
        }
    }
}

void lee2(int M[NMAX+5][NMAX+5])
{
    int x,y,xx,yy;
    M[l1][c1]=daenerys[l1][c1];
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        q.pop();
        for(int k=0; k<4; ++k)
        {
            xx=x+dx[k];
            yy=y+dy[k];
            if(xx>0 && yy>0 && xx<=n && yy<=m)
                if(M[xx][yy]!=-1 && min(M[x][y],daenerys[xx][yy])>M[xx][yy])
                {
                    M[xx][yy]=min(M[x][y],daenerys[xx][yy]);
                    q.push(make_pair(xx,yy));
                }
        }
    }
}

int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    scanf("%d%d\n",&n,&m);
    for(i=1; i<=n; ++i)
    {
        gets(s+1);
        for(j=1; j<=m; ++j)
        {
            if(s[j]=='.')
            {
                daenerys[i][j]=inf;
                D[i][j]=0;
                continue;
            }
            if(s[j]=='*')
            {
                daenerys[i][j]=-1;
                D[i][j]=-1;
                continue;
            }
            if(s[j]=='D')
            {
                D[i][j]=-1;
                q.push(make_pair(i,j));
                continue;
            }
            if(s[j]=='I')
            {
                daenerys[i][j]=inf;
                l1=i;
                c1=j;
                continue;
            }
            daenerys[i][j]=inf;
            l2=i;
            c2=j;
        }
    }
    lee1(daenerys);
    q.push(make_pair(l1,c1));
    lee2(D);
    if(D[l2][c2]==0)
        printf("-1\n");
    else printf("%d\n",D[l2][c2]);
    return 0;
}