Cod sursa(job #2349896)

Utilizator mihaimodiMihai Modi mihaimodi Data 20 februarie 2019 20:20:31
Problema Barbar Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.8 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int n,m,ls,cs,lf,cf,sol,nrd;
char c;
int dx[]={0,1,0,-1,0},dy[]={0,0,1,0,-1};
struct dragoni
{
    int l,c;
}v[100001];
struct coada
{
    int l,c;
}q[1000001];
int a[1001][1001],d[1001][1001],drum[1001][1001];
bool inrange(int x, int y)
{
    return x>0&&x<=n&&y>0&&y<=m;
}
bool ok;
int coada(int range)
{
    memset(drum,0,sizeof(drum));
    memset(d,0,sizeof(d));
    for(int i=1;i<=nrd;i++)
    {
        int st=1,dr=1;
        q[st].l=v[i].l;
        q[st].c=v[i].c;
        d[q[st].l][q[st].c]=1;
        while(st<=dr)
        {
            int l=q[st].l;
            int c=q[st].c;
            for(int k=1;k<=4;k++)
            {
                int ln=l+dx[k];
                int cn=c+dy[k];
                if(inrange(ln,cn)&&a[ln][cn]!=1)
                {
                    if((d[ln][cn]==0||d[ln][cn]>d[l][c]+1)&&d[l][c]+1<range)
                    {
                        d[ln][cn]=d[l][c]+1;
                        dr++;
                        q[dr].l=ln;
                        q[dr].c=cn;
                    }
                }
            }
            st++;
        }
    }
    ok=1;
    int st=1;
    int dr=1;
    q[1].l=ls;
    q[1].c=cs;
    drum[ls][cs]=1;
    while(st<=dr)
    {
        int l=q[st].l;
        int c=q[st].c;
        for(int k=1;k<=4;k++)
        {
            int ln=l+dx[k];
            int cn=c+dy[k];
            if(inrange(ln,cn))
            {
                if(d[ln][cn]==0&&a[ln][cn]==0&&drum[ln][cn]==0)
                {
                    drum[ln][cn]=drum[l][c]+1;
                    dr++;
                    q[dr].l=ln;
                    q[dr].c=cn;
                }
            }
        }
        st++;
    }
    for(int ii=1;ii<=n;ii++)
    {
        for(int jj=1;jj<=m;jj++)
            fout<<drum[ii][jj]<<' ';
        fout<<'\n';
    }
    fout<<'\n';

    return drum[lf][cf];
}
int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++)
        for(int j=1;j<=m;j++)
            {
                fin>>c;
                if(c=='I')
                    ls=i,cs=j;
                else if(c=='O')
                    lf=i,cf=j;
                else if(c=='*')
                    a[i][j]=1;
                else if(c=='D')
                {
                    nrd++;
                    v[nrd].l=i;
                    v[nrd].c=j;
                    a[i][j]=2;
                }
            }
    int st=0,dr=100000;
    while(st<=dr)
    {
        int mid=(st+dr)/2;
        int dist=coada(mid);
        if(dist!=0)
        {
            sol=mid;
            st=mid+1;
        }
        else
            dr=mid-1;
    }
    fout<<sol-1;
    return 0;
}