Cod sursa(job #2625020)

Utilizator NoRules123Osadici Darius Bogdan NoRules123 Data 5 iunie 2020 17:51:43
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m;
int a[1001][1001],dp[1001][1001];
int dragon[1001][1001],sx,sy,fx,fy;
const int di[4]={1,0,-1,0};
const int dj[4]={0,1,0,-1};
queue<pair<int,int> > qd;
queue<pair<int,int > > qp;
bool inside(int x,int y)
{
    if(x<1 || y<1 || x>n || y>m)return false;
    return true;
}
void lee_dragons()
{
    while(!qd.empty())
    {
        int x=qd.front().first;
        int y=qd.front().second;
        qd.pop();
        for(int k=0;k<4;++k)
        {
            int xnou=x+di[k];
            int ynou=y+dj[k];
            if(inside(xnou,ynou) && a[xnou][ynou]==0 && dragon[xnou][ynou]>dragon[x][y]+1)
            {
                    dragon[xnou][ynou]=dragon[x][y]+1;
                    qd.push(make_pair(xnou,ynou));
            }
        }
    }
}
void lee_jucator()
{
    while(!qp.empty())
    {
        int x=qp.front().first;
        int y=qp.front().second;
        qp.pop();
        for(int k=0;k<4;k++)
        {
            int xnou=x+di[k];
            int ynou=y+dj[k];
            if(inside(xnou,ynou) && a[xnou][ynou]==0 && dp[xnou][ynou]<min(dp[x][y],dragon[xnou][ynou]))
            {
                dp[xnou][ynou]=min(dp[x][y],dragon[xnou][ynou]);
                ///if(xnou==fx && ynou==fy)return;
                qp.push(make_pair(xnou,ynou));
            }
        }
    }
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            dp[i][j]=-1;
            dragon[i][j]=INT_MAX;
            char c;
            fin>>c;
            if(c=='*')
            {
                a[i][j]=1;
            }
            else if(c=='.')
                a[i][j]=0;
            else if(c=='D')
            {
                a[i][j]=0;
                dragon[i][j]=0;
                qd.push(make_pair(i,j));
            }
            else if(c=='I')
            {
                sx=i;sy=j;
                a[i][j]=0;
            }
            else if(c=='O')
            {
                fx=i;fy=j;
                a[i][j]=0;
            }
        }
    }
    lee_dragons();
    dp[sx][sy]=dragon[sx][sy];
    qp.push(make_pair(sx,sy));
    lee_jucator();
    /*for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            cout<<dp[i][j]<<" ";
        }
        cout<<'\n';
    }
    */
    fout<<dp[fx][fy];
    return 0;
}