Cod sursa(job #2297070)

Utilizator cyg_SerbanBFlorin Gheorghe cyg_SerbanB Data 5 decembrie 2018 11:53:22
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda prega_casi_5.12.2018 Marime 1.78 kb
#include <bits/stdc++.h>
using namespace std;
char mat[1005][1005];
int ars[1005][1005],dd[1005][1005];
int dx[]={0,0,1,-1};
int dy[]={1,-1,0,0};
queue<pair<int,int> >q;
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int n,m,i,j,xi,yi,xf,yf,x,y,x1,y1,d;
    scanf("%d%d",&n,&m);
    for(i=1;i<=n;++i)
    {
        scanf("\n");
        for(j=1;j<=m;++j)
        {
            scanf("%c",&mat[i][j]);
            if(mat[i][j]=='I')
                xi=i,yi=j;
            if(mat[i][j]=='O')
                xf=i,yf=j;
            if(mat[i][j]=='D')
                q.push(make_pair(i,j));
            else
                ars[i][j]=n*m+1;
        }
    }
    for(i=0;i<=n+1;i++)
        mat[i][0]=mat[i][m+1]='*';
    for(j=0;j<=m+1;j++)
        mat[0][j]=mat[n+1][j]=='*';
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        for(i=0;i<4;++i)
        {
        x1=x+dx[i];y1=y+dy[i];
        if(mat[x1][y1]!='*' && ars[x1][y1]>ars[x][y]+1)
        {
            ars[x1][y1]=ars[x][y]+1;
            q.push(make_pair(x1,y1));
        }
        }
        q.pop();
    }
    q.push(make_pair(xi,yi));
    dd[xi][yi]=ars[xi][yi];
    while(!q.empty())
    {
        x=q.front().first;
        y=q.front().second;
        for(i=0;i<4;++i)
        {
            x1=x+dx[i];y1=y+dy[i];
            if(mat[x1][y1]!='*')
            {
                d=min(ars[x1][y1],dd[x][y]);
                if(dd[x1][y1]<d)
                {
                    dd[x1][y1]=d;
                    q.push(make_pair(x1,y1));
                }
            }
        }
        q.pop();
    }
    if(dd[xf][yf]==0)
        printf("-1");
    else
        printf("%d",dd[xf][yf]);
    return 0;
}