Cod sursa(job #2330663)

Utilizator SerbSergiuSerb Sergiu SerbSergiu Data 28 ianuarie 2019 18:55:51
Problema Barbar Scor 50
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.62 kb
#include <iostream>
#include <fstream>
#include <cstring>
#include<queue>

using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
short int DMap[1000][1000], CopyMap[1000][1000], dI, dJ, PLocI, PLocJ, FLocI, FLocJ, LastDragonIndex=-1;
short int di[4]={0,0,1,-1};
short int dj[4]={1,-1,0,0};
queue < pair< int, int > > coada;
pair< int, int> Dragons[1000000];

void MapRead()
{
    char aux[1001];
    unsigned short int i,j;
    for(i=0; i<dI;i++)
    {
        in.getline(aux, 1001);
        for(j=0;j<strlen(aux);j++)
        {
            switch (aux[j])
            {
            case 'O':
                {
                    DMap[i][j]= 4;
                    FLocI=i;
                    FLocJ=j;
                    break;
                }
             case '.':
                {
                    DMap[i][j]= 0;
                    break;
                }
             case 'D':
                {
                    DMap[i][j]= -2;
                    Dragons[++LastDragonIndex].first=i;
                    Dragons[LastDragonIndex].second=j;
                    break;
                }
             case 'I':
                {
                    DMap[i][j]= 3;
                    PLocI=i;
                    PLocJ=j;
                    break;
                }
             case '*':
                {
                    DMap[i][j]= -1;
                    break;
                }
            }
        }
    }
}

void MapOut()
{
    for(int i=0;i<dI;i++)
    {
        for(int j=0;j<dJ;j++)
            cout<<CopyMap[i][j]<<" ";
        cout<<'\n';
    }
}

bool OK(int i, int j)
{
    if(i < 0 || j < 0 || i > dI || j >dJ)
        return false;
    if( CopyMap[i][j]==-1 || CopyMap[i][j]==-2)
        return false;
    return true;

}

void Lee()
{
    int i, j, i_next, j_next;
    CopyMap[PLocI][PLocJ]=1;
    coada.push(make_pair(PLocI, PLocJ));
    while(!coada.empty())
    {
        i=coada.front().first;
        j=coada.front().second;
        coada.pop();
        for(int directie=0;directie<4;directie++)
        {
            i_next = i + di[directie];
            j_next = j+ dj[directie];
            if(OK(i_next, j_next) && CopyMap[i_next][j_next]==0)
            {
                CopyMap[i_next][j_next] = CopyMap[i][j] + 1;
                coada.push(make_pair(i_next,j_next));
            }
        }

    }
}
void CloneMap()
{
    for( int i =0; i<= dI;i++)
        for (int j=0; j<=dJ; j++)
            CopyMap[i][j]= DMap[i][j];
}
bool CheckResult()
{
    for(int directie = 0;directie< 4;directie++)
    {
        if(OK(FLocI + di[directie], FLocJ + dj[directie]) && CopyMap[FLocI+ di[directie]][ FLocJ + dj[directie]]!=0)
            return true;
    }
    return false;
}
void GrowDragon()
{
    short int LastDragonIndexCopy = LastDragonIndex;
    for(int i=0;i<=LastDragonIndexCopy;i++)
    {
        for(int directie=0; directie<4; directie++)
            if(OK(Dragons[i].first+di[directie], Dragons[i].second+dj[directie]))
            {
                  DMap[Dragons[i].first+di[directie]][Dragons[i].second+dj[directie]]=-2;
                  Dragons[++LastDragonIndex].first=Dragons[i].first+di[directie];
                  Dragons[LastDragonIndex].second=Dragons[i].second+dj[directie];
            }
    }
}

int main()
{
    short int DMin=0;
    in>> dI>>dJ;
    in.ignore();
    MapRead();
    do{
        CloneMap();
        Lee();
        DMin++;
        GrowDragon();
    }while (CheckResult());
    if(DMin-1 == 0)
        out<<-1;
    else out<<DMin-1;
    return 0;
}