Cod sursa(job #3237899)

Utilizator Octavian1910Stanislav Octavian George Octavian1910 Data 14 iulie 2024 02:32:06
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.19 kb
#include <iostream>
#include <fstream>
#include <queue>
#include <iomanip>
#define len 1003 //valoarea nu va merge aici
using namespace std;

ifstream fin("barbar.in");
ofstream fout("barbar.out");
int r,c,psi,psj,pfi,pfj,v[len][len],max1=-10;

//pt vizitare vecini
int di[4]= {0,0,1,-1};
int dj[4]= {-1,1,0,0}; //st dr sus jos

queue<pair<int,int>> q;


int verificare(int i,int j)
{
    if(i<1 || i>r || j<1 || j>c)
        return 0;
    if(v[i][j]==-1 || v[i][j]==0) //  v[i][j]==0 pt ca se poate ca dragonii sa fie vecini
        return 0;
    return 1;
}


int verificare2(int i,int j)
{
    if(i<1 || i>r || j<1 || j>c)
        return 0;
    if(v[i][j]==-1)
        return 0;
    return 1;
}


void Lee()
{
    for(int i=0; i<=r+1; i++)
        for(int j=0; j<=c+1; j++)
        {
            if(v[i][j]!=0 && v[i][j]!=-1) //diferit de dragoni si e perete
            {
                v[i][j]=1e7;
            }
        }


    while(q.size()>0)
    {
        int lin=q.front().first;
        int col=q.front().second;
        q.pop();

        if(v[lin][col]>max1)
        {
            max1=v[lin][col];
        }

        for(int i=0; i<4; i++)
        {
            int nlin=lin+di[i];
            int ncol=col+dj[i];
            if(verificare(nlin,ncol) && v[lin][col]+1<v[nlin][ncol] )
            {
                v[nlin][ncol]=v[lin][col]+1;
                q.push( make_pair(nlin,ncol) );
            }
        }

    }

}


int Lee2(int nr)
{

    int viz[len][len];
    for(int i=0; i<=r+1; i++)
        for(int j=0; j<=c+1; j++)
        {
            viz[i][j]=0;
        }
    q.push(make_pair(psi,psj)); //pct de start
    while(q.size()>0)
    {
        int lin=q.front().first;
        int col=q.front().second;
        q.pop();
        viz[lin][col]=1;
        if(v[lin][col]<nr) return 0;

        for(int i=0; i<4; i++)
        {
            int nlin=lin+di[i];
            int ncol=col+dj[i];
            if(verificare2(nlin,ncol) && v[nlin][ncol]>=nr && viz[nlin][ncol]==0)
            {
                viz[nlin][ncol]=1;
                q.push( make_pair(nlin,ncol) );
            }
        }

    }


    if(viz[pfi][pfj]!=1)
    {
        return 0;
    }
    else return 1;

}


int main()
{
    char x;
    fin>>r>>c;
    for(int i=1; i<=r; i++)
        for(int j=1; j<=c; j++)
        {
            fin>>x;
            if(x=='.')  //celula libera
                v[i][j]=1;
            if(x=='*')      //perete
                v[i][j]=-1;
            if(x=='D')  //pct dargoni
            {
                v[i][j]=0;
                q.push(make_pair(i,j));

            }
            if(x=='I')      //pct start
            {
                v[i][j]=-2;
                psi=i;
                psj=j;
            }
            if(x=='O') //pct iesire
            {
                v[i][j]=-2;
                pfi=i;
                pfj=j;
            }
        }

        Lee();
        int last=-1;
        for(int i=0;i<=max1;i++)
        {
            if(Lee2(i))
            {
                last=i;
            }
        }

        fout<<last;
        return 0;

}