Cod sursa(job #2937803)

Utilizator TraianQTraianQ TraianQ Data 11 noiembrie 2022 00:29:19
Problema Barbar Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <fstream>
using namespace std;
char ch[1005][1005];
int X[1000005],Y[1000005],dmin[1005][1005];
int dx[]={1,-1,0,0};
int dy[]={0,0,1,-1};
int n,m,x1,y1,x2,y2,cnt;
int interior(int a,int b)
{
    return a>0 && b>0 && a<=n && b<=m;
}
int uV[1005][1005];
void flood(int x,int y,int dist)
{
    if(interior(x,y)==0 || uV[x][y]!=0 || dmin[x][y]<dist)
        return;
    else
    {
        uV[x][y]=1;
    }
    flood(x+1,y,dist);
    flood(x-1,y,dist);
    flood(x,y+1,dist);
    flood(x,y-1,dist);
}
int main()
{
    ifstream cin("barbar.in");
    ofstream cout("barbar.out");
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
        {
            cin>>ch[i][j];
            if(ch[i][j]=='I')
                x1=i,y1=j;
            else if(ch[i][j]=='O')
                x2=i,y2=j;
            else if(ch[i][j]=='D')
            {
                cnt++;
                dmin[i][j]=1;
                X[cnt]=i;
                Y[cnt]=j;
            }
        }
    int st=1,dr=cnt;
    while(st<=dr)
    {
        for(int k=0;k<4;k++)
        {
            int nx=X[st]+dx[k],ny=Y[st]+dy[k];
            if(interior(nx,ny)==1 && (ch[nx][ny]!='*') && dmin[nx][ny]==0)
            {
                dmin[nx][ny]=dmin[X[st]][Y[st]]+1;
                dr++;
                X[dr]=nx;
                Y[dr]=ny;
            }
        }
        st++;
    }
    st=1,dr=2000;
    int retin=0;
    while(st<=dr)
    {
        int mij=(st+dr)/2;
        flood(x1,y1,mij);
        if(uV[x2][y2]==1)
        {
            retin=mij;
            st=mij+1;
        }
        else
            dr=mij-1;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                uV[i][j]=0;
    }
    cout<<retin-1;
    return 0;
}