Cod sursa(job #1543283)

Utilizator KOzarmOvidiu Badea KOzarm Data 6 decembrie 2015 10:21:52
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#include <string.h>
#define inf 1000000001
using namespace std;
ifstream fin("barbar.in");
ofstream fout("barbar.out");
int dx[]={-1,0,1,0},dy[]={0,-1,0,1};
struct str
{
  int l,c;
};
str cd[1000001],ip,fi;
int k,a[1005][1005],n,m,i,j,sol;
bool viz[1005][1005],ok;
char s[1005];
void formmat()
{
    int ic=1;
    int sc=k;
    int pl,pc,noul,nouc;
    for(ic=1;ic<=sc;ic++)
    {
        pl=cd[ic].l;
        pc=cd[ic].c;
        for(int i=0;i<=3;i++)
        {
            noul=pl+dx[i];
            nouc=pc+dy[i];
            if(a[noul][nouc]==inf)
            {
                a[noul][nouc]=a[pl][pc]+1;
                sc++;
                cd[sc].l=noul;cd[sc].c=nouc;
            }

        }

    }
}
bool bf(int z)
{
    if(a[ip.l][ip.c]<z)
        return 0;

        memset(viz,0,sizeof(viz));
    cd[1].l=ip.l;
    cd[1].c=ip.c;
    int ic=1;
    int sc=1;
    int pl,pc;
    viz[ip.l][ip.c]=1;
    while(ic<=sc)
    {
        pl=cd[ic].l;
        pc=cd[ic].c;
        for(int i=0;i<=3;i++)
        if(viz[pl+dx[i]][pc+dy[i]]==0&&a[pl+dx[i]][pc+dy[i]]>=z)
        {
            viz[pl+dx[i]][pc+dy[i]]=1;
            cd[++sc].l=pl+dx[i];
            cd[sc].c=pc+dy[i];
            if(fi.l==pl+dx[i]&&fi.c==pc+dy[i])
                return 1;
        }
        ic++;
    }
    return 0;
}
int main()
{
    fin>>n>>m;
    fin.get();
    for(i=1;i<=n;i++)
    {
        memset(s,0,strlen(s));
        fin.getline(s,m+1);
        for(j=0;j<m;j++)
        switch(s[j])
        {
            case '.':a[i][j+1]=inf;break;
            case 'I':

                a[i][j+1]=inf;
                ip.l=i;
                ip.c=j+1;
            break;
            case 'D':
                cd[++k].l=i;
                cd[k].c=j+1;
                a[i][j+1]=0;
            break;
            case '*':a[i][j+1]=-1;break;
            case 'O':

                fi.l=i;
                fi.c=j+1;
                a[i][j+1]=inf;
            break;
        }
    }
    for(i=0;i<=m+1;i++)
    {
        a[0][i]=-1;
        a[n+1][i]=-1;
    }
    for(i=0;i<=n+1;i++)
    {
        a[i][0]=-1;
        a[i][m+1]=-1;
    }
    formmat();
    int q=0,w=max(n,m);
    sol=-1;
    while(q<=w)
    {
        int mid=(q+w)/2;
        ok=bf(mid);
        if(ok==1)
        {

            sol=mid;
            q=mid+1;
        }
       else
            w=mid-1;
    }
    fout<<sol;

    return 0;
}