Cod sursa(job #2307509)

Utilizator MoldovanAndrei1Moldovan Andrei MoldovanAndrei1 Data 24 decembrie 2018 18:59:28
Problema Barbar Scor 30
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
using namespace std;
int modul(int x,int y)
{
    if(x<y)return y-x;
    return x-y;
}
char s[1005][1005];
int viz[1005][1005];
struct dr
{
    int x,y;
};
dr k[100005];
int dist[1005][1005];
int m1[1005][1005],m,n,cnt;
void reint(int sl[1005][1005])
{
    for(int i=1;i<=m;i++)
        for(int j=1;j<=n;j++)
        sl[i][j]=0;
}
int dx[]={0,1,0,-1},dy[]={1,0,-1,0};
bool ok(dr st,dr fi,int oc)
{
    if(oc<dist[st.x][st.y])return 0;
    if(oc<dist[fi.x][fi.y])return 0;
    m1[st.x][st.y]=1;
    queue<dr>q;
    int ver=0;
    q.push(st);
    while(!q.empty())
    {
        st=q.front();
        q.pop();
        if(ver==1)continue;
        for(int i=0;i<4;i++)
        {
            dr fg;
            fg.x=st.x+dx[i];
            fg.y=st.y+dy[i];
            if(m1[fg.x][fg.y])continue;
            if(dist[fg.x][fg.y]>oc)continue;
            if(viz[fg.x][fg.y])continue;
            m1[fg.x][fg.y]=1;
            q.push(fg);
            if(fg.x=fi.x&&fg.y==fi.y)return 1;
        }
    }
    return 0;
}
int main()
{
    freopen("barbar.in","r",stdin);
    freopen("barbar.out","w",stdout);
    int i,j;
    scanf("%d%d\n",&m,&n);
    for(i=1;i<=m;i++)
    {
        fgets(s[i]+1,1005,stdin);
        s[i][n+1]=NULL;
    }
    dr start,stop;
    for(i=1;i<=m;i++)
    {
        for(j=1;j<=n;j++)
        {
            dist[i][j]=1000000;
            if(s[i][j]=='D')
            {
                viz[i][j]=2;
                k[++cnt].x=i;k[cnt].y=j;
                continue;
            }
            if(s[i][j]=='*')
            {
                viz[i][j]=1;
                continue;
            }
            if(s[i][j]=='I')
            {
                start.x=i;
                start.y=j;
                continue;
            }
            if(s[i][j]=='O')
            {
                stop.x=i;
                stop.y=j;
                continue;
            }
        }
    }
    for(i=1;i<=cnt;i++)
    {
        for(j=1;j<=m;j++)
        {
            for(int h=1;h<=n;h++)
                dist[j][h]=min(dist[j][h],modul(j,k[i].x)+modul(h,k[i].y));
        }
    }
    for(i=1;i<=m+1;i++)
        viz[i][0]=viz[i][n+1]=1;
    for(j=1;j<=n+1;j++)
        viz[0][j]=viz[m+1][j]=1;
    int st=0,dr=m+n;
    while(st<=dr)
    {
        int med=(st+dr)/2;
        reint(m1);
        bool l=ok(start,stop,med);
        if(l==1)dr=med-1;
        else
            st=med+1;
    }
    printf("%d\n",st-1);
    return 0;
}