Cod sursa(job #2958789)

Utilizator MihaiCostacheCostache Mihai MihaiCostache Data 28 decembrie 2022 12:50:09
Problema Barbar Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.07 kb
#include <bits/stdc++.h>

using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n, m, a[1001][1001], x, y, x2, y2, st=1, dr, viz[1001][1001];
char ch;
int di[4]={1, -1, 0, 0};
int dj[4]={0, 0, 1, -1};
struct coada
{
    int x;
    int y;
}q[1000001];
int main()
{
    fin>>n>>m;
    for(int i=1; i<=n; i++)
    {
        for(int j=1; j<=m; j++)
        {
            fin>>ch;
            if(ch=='.')
            {
                a[i][j]=0;
            }
            else if(ch=='*')
            {
                a[i][j]=-1;
            }
            else if(ch=='D')
            {
                q[++dr]={i, j};
                a[i][j]=1;
            }
            else if(ch=='I')
            {
                x=i;
                y=j;
            }
            else if(ch=='O')
            {
                x2=i;
                y2=j;
            }
        }
    }
    while(st<=dr)
    {
        int i=q[st].x;
        int j=q[dr].y;
        st++;
        for(int d=0; d<4; d++)
        {
            int ii = i + di[d];
            int jj = j + dj[d];
            if (ii>=1 && jj>=1 && ii <= n && jj <= m && a[ii][jj] == 0)
            {
                q[++dr]={ii, jj};
                a[ii][jj]=a[i][j]+1;
            }
        }
    }
    int sol=-1;
    int p=1;
    int u=n*m;
    while(p<=u)
    {
        int mid=(p+u)/2;
        if(a[x][y]<mid)
        {
            u=mid-1;
            continue;
        }
        memset(viz, 0, sizeof(viz));
        st=dr=1;
        q[1]={x, y};
        viz[x][y]=1;
        while(st<=dr)
        {
            int i=q[st].x;
            int j=q[st].y;
            st++;
            for(int d=0; d<4; d++)
            {
                int ii=i+di[d];
                int jj=j+dj[d];
                if(ii>=1 && jj>=1 && ii<=n && jj<+m && viz[ii][jj]==0)
                {
                    viz[ii][jj]=1;

                }
            }
        }
        if(viz[x2][y2]==1)
        {
            p=mid+1;
            sol=mid-1;
        }
        else
        {
            u=mid-1;
        }
    }
    fout<<sol;
    return 0;
}