Cod sursa(job #2986543)

Utilizator tmi26Teodor Stupariu tmi26 Data 28 februarie 2023 19:02:49
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.19 kb
#include <fstream>
#include <queue>
#define PII pair<int,int>
using namespace std;
ifstream cin("barbar.in");
ofstream cout("barbar.out");
queue<PII>coada;
int n,m,mines[1005][1005],mat[1005][1005],dp[1005][1005];
PII d[4]= {{-1,0}, {0,1}, {1,0}, {0,-1}};
int ver(int l,int c)
{
    if(l<1)
        return 0;
    if(c<1)
        return 0;
    if(l>n)
        return 0;
    if(c>m)
        return 0;
    return 1;
}
void push(int linact,int colact)
{
    for(int i=0; i<4; i++)
    {
        int lf,cf;
        lf=linact+d[i].first;
        cf=colact+d[i].second;
        if(ver(lf,cf)&&!mat[lf][cf]&&mines[lf][cf]==-1)
        {
            coada.push({lf,cf});
            mines[lf][cf]=mines[linact][colact]+1;
        }
    }
}
void lee()
{
    while(coada.size())
    {
        int linact,colact;
        linact=coada.front().first;
        colact=coada.front().second;
        coada.pop();
        push(linact,colact);
    }
}
void dfs(int la,int ca,int valact)
{
    dp[la][ca]=valact;
    for(int i=0; i<4; i++)
    {
        int ln,cn;
        ln=la+d[i].first;
        cn=ca+d[i].second;
        if(ver(ln,cn)&&!mat[ln][cn]&&dp[ln][cn]<valact)
        {
            if(mines[ln][cn]>valact)
                dfs(ln,cn,valact);
            else if(mines[ln][cn]!=dp[ln][cn])
                dfs(ln,cn,mines[ln][cn]);
        }
    }
}
int main()
{
    int lp,cp,lt,ct;
    char ch;
    cin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            cin>>ch;
            mines[i][j]=-1;
            switch(ch)
            {
            case '*':
            {
                mat[i][j]=1;
                break;
            }
            case 'I':
            {
                lp=i,cp=j;
                break;
            }
            case 'O':
            {
                lt=i,ct=j;
                break;
            }
            case 'D':
            {
                coada.push({i,j});
                mines[i][j]=0;
                break;
            }
            }
            dp[i][j]=-1;
        }
    }
    lee();
    dfs(lp,cp,mines[lp][cp]);
    cout<<dp[lt][ct];
    return 0;
}