Cod sursa(job #1894363)

Utilizator FloareaCucura Floarea Ludovica Floarea Data 26 februarie 2017 19:36:17
Problema Barbar Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.93 kb
#include <fstream>
#include <algorithm>
#include<vector>
#include<set>

using namespace std;

 ifstream fin("barbar.in");
 ofstream fout("barbar.out");
 struct coada
 {
     int x,y;
 }c[1000050];
 coada v[1000050];

int componente,i,aux,n,k,j,p,s,unu,t,m,doi,x,q,st,dr,maxi,maxi2,y,conex,x1,x2,y2,lin,col,t1,mij,ok,sol;
int a[1009][1009];
int b[1009][1009];
int dx[]={0,-1,0,1};
int dy[]={1,0,-1,0};
char ch;

void lee(int k)
{
     lin=c[k].x;
     col=c[k].y;
            for(j=0;j<=3;j++)
            {
                if(lin+dx[j] >=1 &&lin+dx[j]<=n && col+dy[j]>=1 && col+dy[j]<=m)
                {
                    if((a[lin+dx[j]][col+dy[j]] == 0))
                    {
                        a[lin+dx[j]][col+dy[j]]=a[lin][col]+1;
                        dr++;
                        c[dr].x=lin+dx[j];
                        c[dr].y=col+dy[j];
                    }
                }
            }
}
void clean()
{
    int i,j;
    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            b[i][j]=0;
        }
    }
}

int verif(int k)
{
    int i;
    clean();
    dr = 0;
    if(a[x1][t1] >= k)
    {
        dr++;
        c[dr].x=x1;
        c[dr].y=t1;
        b[x1][t1]=1;
    }

    for(i=1;i<=dr;i++)
        {
            lin=c[i].x;
            col=c[i].y;
            for(j=0;j<=3;j++)
            {
                if(lin+dx[j] >=1 &&lin+dx[j]<=n && col+dy[j]>=1 && col+dy[j]<=m)
                {
                    if( b[lin+dx[j]][col+dy[j]]==0 && a[lin+dx[j]][col+dy[j]]>=k)
                    {
                        b[lin+dx[j]][col+dy[j]]=b[lin][col]+1;
                        dr++;
                        c[dr].x=lin+dx[j];
                        c[dr].y=col+dy[j];
                    }
                }
            }
        }
    if(b[x2][y2]!=0) return 1;
    return 0;
}

int main()
{
    fin>>n>>m;

    for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
            fin>>ch;
            if(ch=='.') a[i][j]=0;
            if(ch=='D')
            {
                dr++;
                c[dr].x=i;
                c[dr].y=j;
                a[i][j]=1;
            }
            if(ch=='*') a[i][j]=-1;
            if(ch=='I')
            {
                x1=i;
                t1=j;
            }
            if(ch=='O')
            {
                x2=i;
                y2=j;
            }
        }
    }
    for(i=1;i<=dr;i++)
    {
        lee(i);
    }

     for(i=1;i<=n;i++)
    {
        for(j=1;j<=m;j++)
        {
           a[i][j]--;
        }
    }
    t=1;
    s=m*n+1;
    while(t<=s)
    {
        mij=(t+s)/2;
        ok=verif(mij);
        if(ok==1)
        {
            sol=mij;
            t=mij+1;
        }
        else
        {
           s=mij-1;
        }
    }
    if(sol==0)
    {
        fout<<"-1";
    }
    else
    fout<<sol<<"\n";
}