Cod sursa(job #2971471)

Utilizator Cazacu2006RazvanRazvan Cazacu Cazacu2006Razvan Data 27 ianuarie 2023 14:16:49
Problema Barbar Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,a[1010][1010],d[1010][1010],st,dr,xi,yi,xf,yf,dx[]={1,-1,0,0},dy[]={0,0,-1,1},viz[1010][1010];
char x[1010];
struct numar
{
    int x,y;
}q[1000010];
int drum(int p)
{
    st=1,dr=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
            viz[i][j]=0;
    }

    viz[xi][yi]=1;

    if(d[xi][yi]<p)
        return 0;


    q[dr]={xi,yi};

    while(st<=dr)
    {

        for(int k=0;k<=3;k++)
        {
            int x=q[st].x+dx[k];
            int y=q[st].y+dy[k];


            if(x>=1 && x<=n && y>=1 && y<=m && viz[x][y]==0 && a[x][y]==0 && d[x][y]>p)
            {
                viz[x][y]=1;
                q[++dr]={x,y};
            }
        }
        st++;
    }


    if(viz[xf][yf]==1)
        return 1;


    return 0;


}
int main()
{
    fin>>n>>m;
    fin.get();
    for(int i=1;i<=n;i++)
    {
        fin.getline(x,sizeof(x));
        for(int j=0;j<m;j++)
        {
             if(x[j]=='D')
             {
                  a[i][j+1]=2;
                  dr++;
                  q[dr]={i,j+1};
                  d[i][j+1]=1;
             }

             else if(x[j]=='*')
                a[i][j+1]=1;
             if(x[j]=='I')
                xi=i,yi=j+1;
             if(x[j]=='O')
                xf=i,yf=j+1;
        }

    }


    st=1;


    while(st<=dr)
    {
        for(int p=0;p<=3;p++)
        {
            int x=q[st].x+dx[p];
            int y=q[st].y+dy[p];
            if(x>=1 && x<=n && y>=1 && y<=m && d[x][y]==0 && a[x][y]==0)
            {
                q[++dr]={x,y};
                d[x][y]=d[q[st].x][q[st].y]+1;
            }
        }
        st++;
    }


    int ss1=1,dd1=10000000,mid=0,poz=0;
    while(ss1<=dd1)
    {
        mid=(ss1+dd1)/2;

        if(drum(mid)==1)
        {

            poz=mid;
            ss1=mid+1;



        }
        else
        {
            dd1=mid-1;


        }




    }
    fout<<poz;
    return 0;
}