Cod sursa(job #2540265)

Utilizator JafarakKarina Jafara Jafarak Data 6 februarie 2020 21:56:18
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.79 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <iomanip>

using namespace std;

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

const int N=1005;

int n,m,istop,jstop,xd,yd;
int dragon[N][N],dude[N][N];

const int di[6]={-1,0,1,0};
const int dj[6]={0,1,0,-1};

queue < pair < int, int > > que,queDragon;

void switch_mat ( char *p, int i, char s[] )
{
    switch(*p)
    {
        case '*':   dude[i][p-s+1]=-1;
                    break;
        case 'I':   que.push(make_pair(i,p-s+1));
                    xd=i;
                    yd=p-s+1;
                    break;
        case 'D':   dragon[i][p-s+1]=1;
                    queDragon.push(make_pair(i,p-s+1));
                    break;
        case 'O':   istop=i;
                    jstop=p-s+1;
                    break;
        case '.':   break;
    }
}

void Read ()
{
    int i;
    char s[N];
    f>>n>>m;f.get();
    for(i=1;i<=n;i++)
    {
        f.getline(s,N);
        char *p;
        for(p=s;*p;p++)
            switch_mat(p,i,s);
    }
}

void out ()
{
    int i,j;
    for(i=1;i<=n;i++,cout<<'\n')
        for(j=1;j<=m;j++)
            cout<<setw(2)<<dude[i][j]<<" ";
    cout<<'\n';
    for(i=1;i<=n;i++,cout<<'\n')
        for(j=1;j<=m;j++)
            cout<<setw(2)<<dragon[i][j]<<" ";
    cout<<'\n';
}

bool ok ( int x, int y )
{
    if(x<1 || y<1 || x>n || y>m)
        return false;
    return true;
}

void lee_drogo ()
{
    int t,i,j,inew,jnew;
    while(!queDragon.empty())
    {
        i=queDragon.front().first;
        j=queDragon.front().second;
        queDragon.pop();
        for(t=0;t<4;t++)
        {
            inew=i+di[t];
            jnew=j+dj[t];
            if(ok(inew,jnew))
                if(!dragon[inew][jnew] || dragon[i][j]+1<dragon[inew][jnew])
                {
                    dragon[inew][jnew]=dragon[i][j]+1;
                    queDragon.push(make_pair(inew,jnew));
                }
        }
    }
}

void lee_dude ()
{
    int t,i,j,inew,jnew;
    dude[xd][yd]=dragon[xd][yd];
    while(!que.empty())
    {
        i=que.front().first;
        j=que.front().second;
        que.pop();
        for(t=0;t<4;t++)
        {
            inew=i+di[t];
            jnew=j+dj[t];
            if(ok(inew,jnew))
            {
                int mini;
                mini=min(dude[i][j],dragon[inew][jnew]);
                if(!dude[inew][jnew] || ( dude[inew][jnew]>0 && mini>dude[inew][jnew] ))
                {
                    que.push(make_pair(inew,jnew));
                    dude[inew][jnew]=mini;
                }
            }
        }
    }
}

int main()
{
    Read();
    lee_drogo();
    lee_dude();
    //out();
    g<<dude[istop][jstop]-1<<'\n';
    return 0;
}