Cod sursa(job #2562476)

Utilizator AsthenichDog390Alex Preda AsthenichDog390 Data 29 februarie 2020 14:49:50
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 kb
#include <bits/stdc++.h>

using namespace std;
ifstream in("barbar.in");
ofstream out("barbar.out");
const int N=1001;
int v[N][N];
int L[N][N],C[N][N];
deque <pair<int ,int> > c;
int xi[5]={0,1,0,-1,0};
int yi[5]={0,0,1,0,-1};
int viz[N][N];
int dd(int x,int y)
{
    int minn=9999;
    for(int i=1;i<=L[x][0];i++)
    {
        if(fabs(y-L[x][i])<minn)
        minn=fabs(y-L[x][i]);
    }
    for(int i=1;i<=C[y][0];i++)
    {
         if(fabs(x-C[y][i])<minn)
        minn=fabs(x-C[y][i]);
    }
    return minn;
}
int main()
{
    int n,m,x,y,xs,ys;
    char a;
    in>>n>>m;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    {
        in>>a;
        if(a=='D')
        {
            L[i][0]++;
            C[j][0]++;
            L[i][L[i][0]]=j;
            C[j][C[j][0]]=i;
            v[i][j]=-1;
        }
        else if(a=='I')
        {
            x=i;
            y=j;
        }
        else if(a=='O')
        {
            xs=i;
            ys=j;
        }
        else if(a=='*')
        {
            v[i][j]=-2;
        }
    }
    c.push_back({x,y});
    viz[x][y]=1;
    v[x][y]=dd(x,y);
    while(!c.empty())
    {
        pair<int ,int> b=c.front();
        c.pop_front();
        int i=b.first,j=b.second;
        for(int k=1;k<=4;k++)
        {
            int i1=i+xi[k],j1=j+yi[k];
            if(i1>=1 && j1>=1 && i1<=n && j1<=n&&v[i1][j1]>=0)
            {
                int d=dd(i1,j1);
                if(viz[i1][j1]==0 || (v[i1][j1]<v[i][j] && d>=v[i][j]))
                {
                    viz[i1][j1]=1;
                    if(v[i1][j1]<v[i][j] && d>=v[i][j])
                    {
                        v[i1][j1]=v[i][j];
                        c.push_front({i1,j1});
                    }
                    else
                    {
                        v[i1][j1]=d;
                        c.push_back({i1,j1});
                    }
                }
            }
        }
    }
    if(v[xs][ys]==0)
    out<<-1;
    else
    out<<v[xs][ys];
    return 0;
}