Cod sursa(job #2961940)

Utilizator gabriel.9619Gabriel Stefan Tita gabriel.9619 Data 7 ianuarie 2023 14:09:14
Problema Barbar Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.41 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");

struct coada{
    int l, c;
}q[1000001];

int viz[1001][1001], c[1001][1001];
int dx[]={1, -1, 0, 0}, dy[]={0, 0, -1, 1};
int n, m, xs, ys, xd, yd;

int interior(int x, int y)
{
    if(x>=1&&x<=n&&y>=1&&y<=m)
    {
        return 1;
    }
    return 0;
}

int bfs(int mid)
{
    int p, u, i;
    p=u=1;
    q[u]={xs,ys};
    if(viz[q[u].l][q[u].c]<mid)
    {
        return 0;
    }
    c[q[u].l][q[u].c]=1;
    int lc, cc, lv, cv;
    while(p<=u&&c[xd][yd]==0)
    {
        lc=q[p].l;
        cc=q[p].c;
        p++;
        for(i=0;i<=3;i++)
        {
            lv=lc+dx[i];
            cv=cc+dy[i];
            if(interior(lc, cv)==1&&viz[lv][cv]>=mid&&c[lv][cv]==0)
            {
                u++;
                q[u]={lv, cv};
                c[lv][cv]=1;
            }
        }
    }
    if(c[xd][yd]==0)
    {
        return 0;
    }
    else
    {
        return 1;
    }
}

int main()
{
    int i, j, sol;
    char x;
    fin>>n>>m;
    int p=1, u=1;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            fin>>x;
            if(x=='.')
            {
                viz[i][j]=0;
            }
            else
            if(x=='I')
            {
                xs=i;
                ys=j;
                viz[i][j]=0;
            }
            else
            if(x=='D')
            {
                viz[i][j]=-1;
                u++;
                q[u]={i,j};
            }
            else
            if(x=='*')
            {
                viz[i][j]=-1;
            }
            else
            {
                viz[i][j]=0;
                xd=i;
                yd=j;
            }
        }
    }
    int lc, cc, lv, cv;
    while(p<=u)
    {
        lc=q[p].l;
        cc=q[p].c;
        p++;
        for(i=0;i<=3;i++)
        {
            lv=lc+dx[i];
            cv=cc+dy[i];
            if(interior(lv, cv)==1&&viz[lv][cv]==0)
            {
                if(viz[lc][cc]>0)
                {
                    viz[lv][cv]=1+viz[lc][cc];
                }
                else
                {
                    viz[lv][cv]=1+(-viz[lc][cc]);
                }
                u++;
                q[u]={lv, cv};
            }
        }
    }
    p=u=1;
    q[u]={xs, ys};
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            if(viz[i][j]>=0)
            {
                viz[i][j]-=1;
            }
        }
    }
    while(p<=u&&c[xd][yd]==0)
    {
        lc=q[p].l;
        cc=q[p].c;
        p++;
        for(i=0;i<=3;i++)
        {
            lv=lc+dx[i];
            cv=cc+dy[i];
            if(interior(lv, cv)==1&&viz[lv][cv]!=-1&&c[lv][cv]==0)
            {
                c[lv][cv]=c[lc][cc]+1;
                u++;
                q[u]={lv, cv};
            }
        }
    }
    if(c[xd][yd]==0)
    {
        fout<<-1;
    }
    else
    {
        int st=0;
        int dr=n*m;
        while(st<=dr)
        {
            memset(c, 0, sizeof(c));
            int mid=(st+dr)/2;
            if(bfs(mid)==1)
            {
                sol=mid;
                st=mid+1;
            }
            else
            {
                dr=mid-1;
            }
        }
    }
    fout<<sol;
}